การแสดงชุดค่าผสม 2 ตัวอักษร


10

คำตอบสำหรับคำถามนี้เกี่ยวกับ SO ได้ส่งคืนชุดของชื่อหนึ่งถึงสองตัวประมาณ 125 ตัว: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing -r วัตถุ

  [1] "Ad" "am" "ar" "as" "bc" "bd" "bp" "br" "BR" "bs" "by" "c"  "C" 
 [14] "cc" "cd" "ch" "ci" "CJ" "ck" "Cl" "cm" "cn" "cq" "cs" "Cs" "cv"
 [27] "d"  "D"  "dc" "dd" "de" "df" "dg" "dn" "do" "ds" "dt" "e"  "E" 
 [40] "el" "ES" "F"  "FF" "fn" "gc" "gl" "go" "H"  "Hi" "hm" "I"  "ic"
 [53] "id" "ID" "if" "IJ" "Im" "In" "ip" "is" "J"  "lh" "ll" "lm" "lo"
 [66] "Lo" "ls" "lu" "m"  "MH" "mn" "ms" "N"  "nc" "nd" "nn" "ns" "on"
 [79] "Op" "P"  "pa" "pf" "pi" "Pi" "pm" "pp" "ps" "pt" "q"  "qf" "qq"
 [92] "qr" "qt" "r"  "Re" "rf" "rk" "rl" "rm" "rt" "s"  "sc" "sd" "SJ"
[105] "sn" "sp" "ss" "t"  "T"  "te" "tr" "ts" "tt" "tz" "ug" "UG" "UN"
[118] "V"  "VA" "Vd" "vi" "Vo" "w"  "W"  "y"

และรหัสการนำเข้า R:

nms <- c("Ad","am","ar","as","bc","bd","bp","br","BR","bs","by","c","C","cc","cd","ch","ci","CJ","ck","Cl","cm","cn","cq","cs","Cs","cv","d","D","dc","dd","de","df","dg","dn","do","ds","dt","e","E","el","ES","F","FF","fn","gc","gl","go","H","Hi","hm","I","ic","id","ID","if","IJ","Im","In","ip","is","J","lh","ll","lm","lo","Lo","ls","lu","m","MH","mn","ms","N","nc","nd","nn","ns","on","Op","P","pa","pf","pi","Pi","pm","pp","ps","pt","q","qf","qq","qr","qt","r","Re","rf","rk","rl","rm","rt","s","sc","sd","SJ","sn","sp","ss","t","T","te","tr","ts","tt","tz","ug","UG","UN","V","VA","Vd","vi","Vo","w","W","y")

เนื่องจากจุดประสงค์ของคำถามคือต้องมีรายชื่อวัตถุที่น่าจดจำที่ต้องหลีกเลี่ยงและมนุษย์ส่วนใหญ่ไม่ค่อยถนัดในเรื่องของข้อความที่เป็นของแข็งฉันจึงอยากจะเห็นสิ่งนี้

น่าเสียดายที่ฉันไม่แน่ใจในวิธีที่ดีที่สุดในการทำเช่นนี้ ฉันคิดถึงบางสิ่งเช่นพล็อตก้านและใบเฉพาะเมื่อไม่มีค่าซ้ำ ๆ กันแต่ละ "ลีฟ" ถูกวางไว้ในคอลัมน์ที่เหมาะสมแทนที่จะถูกทิ้งให้เป็นธรรม หรือการปรับรูปแบบของคำที่มีขนาดตัวอักษรตามความแพร่หลาย

สิ่งนี้จะเป็นภาพที่ชัดเจนและมีประสิทธิภาพที่สุด

การสร้างภาพข้อมูลที่เหมาะสมอย่างใดอย่างหนึ่งต่อไปนี้ในจิตวิญญาณของคำถามนี้:

  • เป้าหมายหลัก: เพิ่มความจำของชุดชื่อโดยเปิดเผยรูปแบบในข้อมูล

  • เป้าหมายทางเลือก: ไฮไลต์คุณสมบัติที่น่าสนใจของชุดชื่อ (เช่นช่วยให้เห็นภาพการแจกแจงตัวอักษรทั่วไป ฯลฯ )

เป็นที่ต้องการคำตอบใน R แต่ยินดีต้อนรับแนวคิดที่น่าสนใจทั้งหมด

ไม่อนุญาตให้ใช้ชื่อตัวอักษรเดียวเนื่องจากจะง่ายต่อการกำหนดเป็นรายการแยกต่างหาก

คำตอบ:


12

นี่คือการเริ่มต้น: ให้จินตนาการสิ่งเหล่านี้ในตารางของตัวอักษรตัวแรกและตัวที่สอง:

combi <- c("Ad", "am", "ar", "as", "bc", "bd", "bp", "br", "BR", "bs", 
"by", "c",  "C",  "cc", "cd", "ch", "ci", "CJ", "ck", "Cl", "cm", "cn", 
"cq", "cs", "Cs", "cv", "d",  "D",  "dc", "dd", "de", "df", "dg", "dn", 
"do", "ds", "dt", "e",  "E",  "el", "ES", "F",  "FF", "fn", "gc", "gl", 
"go", "H",  "Hi", "hm", "I",  "ic", "id", "ID", "if", "IJ", "Im", "In", 
"ip", "is", "J",  "lh", "ll", "lm", "lo", "Lo", "ls", "lu", "m",  "MH", 
"mn", "ms", "N",  "nc", "nd", "nn", "ns", "on", "Op", "P",  "pa", "pf", 
"pi", "Pi", "pm", "pp", "ps", "pt", "q",  "qf", "qq", "qr", "qt", "r",  
"Re", "rf", "rk", "rl", "rm", "rt", "s",  "sc", "sd", "SJ", "sn", "sp", 
"ss", "t",  "T",  "te", "tr", "ts", "tt", "tz", "ug", "UG", "UN", "V",  
"VA", "Vd", "vi", "Vo", "w",  "W",  "y")

df <- data.frame (first = factor (gsub ("^(.).", "\\1", combi), 
                                  levels = c (LETTERS, letters)),
                  second = factor (gsub ("^.", "", combi), 
                                  levels = c (LETTERS, letters)),
                  combi = combi))

library(ggplot2)
ggplot (data = df, aes (x = first, y = second)) + 
   geom_text (aes (label = combi), size = 3) + 
   ## geom_point () +
   geom_vline (x = 26.5, col = "grey") + 
   geom_hline (y = 26.5, col = "grey")

(เดิมคือจดหมายสองฉบับ:) ตารางด้วยตัวอักษร

ggplot (data = df, aes (x = second)) + geom_histogram ()

ตัวอักษรที่สอง

ggplot (data = df, aes (x = first)) + geom_histogram ()

จดหมายฉบับแรก

ฉันรวบรวม:

  • ของชื่อจดหมายหนึ่งฉบับ

    • โชคดีi, j, kและlที่มีอยู่ (ดังนั้นฉันสามารถจัดทำดัชนีถึงอาร์เรย์ 4d)
    • น่าเสียดายที่t(เวลา) c(ความเข้มข้น) หายไป ดังนั้นm(มวล), V(ปริมาตร) และF(แรง) ไม่มีรัศมีหรือเส้นผ่าศูนย์กลางrd
    • ฉันสามารถมีแรงกดดัน ( p) ปริมาณของสาร ( n) และความยาวlได้
    • บางทีฉันอาจจะต้องเปลี่ยนชื่อกรีก: εก็โอเค แต่ก็ไม่ควร

      π <- pi

      ?

  • ฉันสามารถมีlowerUPPERชื่ออะไรก็ได้ที่ฉันต้องการ

  • โดยทั่วไปแล้วการเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่จะเป็นเดิมพันที่ปลอดภัยกว่าตัวพิมพ์เล็ก

  • อย่าเริ่มต้นด้วยcหรือd


เป็นการเริ่มต้นที่ดี อาจเพิ่มเส้นควอดเรนท์ (ในเครื่องหมาย + ใหญ่) ผ่านพล็อต 2d เพื่อให้เข้าใจได้ดีขึ้นว่าตัวอักษรตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กไปไหน
Ari B. Friedman

คิดว่าฉันทำอย่างนั้น อย่างไรก็ตามนี่มันคือ @ gsk3: ขอบคุณที่อัพโหลดภาพ!
cbeleites ไม่มีความสุขกับ SX

ดี และในทางตรงกันข้ามขอขอบคุณที่ให้คำตอบที่น่าสนใจเพื่อแจ้งให้ # 2 :-)
Ari B. Friedman

ดูที่พล็อต 2d ของคุณข้อเสนอแนะอื่นอาจลดลงไปที่ตาราง 27x26 และเปลี่ยนสัญลักษณ์หรือสี (หรือกระวนกระวายใจด้วยอัลฟา) หากตัวอักษรที่กำหนดมีตัวอักษรล่าง / บน / ทั้งคู่ อาจทำให้แถว NA เป็นสีอื่นเพื่อแยกออกเป็นภาพได้
Ari B. Friedman

1
ฉันได้ดูที่ 27 x 26 ก่อนโพสต์คำตอบ (ที่มีสีและรูปร่างตามตัวอักษรตัวแรกและตัวที่สองเป็นตัวพิมพ์ใหญ่) แต่นั่นไม่ได้ส่งข้อความที่ง่ายดังนั้นฉันกลับไปหากริดที่ใหญ่ขึ้นทันที
cbeleites ไม่มีความสุขกับ SX

8

ตกลงนี่คือสิ่งที่ฉันต้องทำอย่างรวดเร็วในการสร้างภาพข้อมูลเหมือน "ตารางธาตุ" ตามคำถาม SO และความคิดเห็นของผู้อื่น ปัญหาหลักคือความแตกต่างของจำนวนตัวแปรระหว่างแพ็คเกจซึ่งเป็นอุปสรรคต่อการสร้างภาพ ... ฉันรู้ว่ามันหยาบมากดังนั้นโปรดเปลี่ยนได้ตามที่คุณต้องการ

นี่คือผลลัพธ์ปัจจุบัน (จากรายการแพ็คเกจของฉัน) พล็อตตัวอย่าง

และรหัส

# Load all the installed packages
lapply(rownames(installed.packages()), require, 
       character.only = TRUE)
# Find variables of length 1 or 2
one_or_two <- unique(apropos("^[a-zA-Z]{1,2}$"))
# Find which package they come from
packages <- lapply(one_or_two, find)
# Some of the variables may belong to multiple packages, so determine the length 
# of each entry in packages and duplicate the names accordingly
lengths <- unlist(lapply(packages, length))
var.data <- data.frame(var = rep(one_or_two, lengths), 
                   package = unlist(packages))

ตอนนี้เรามี data frame ดังนี้:

> head(var.data, 10)
   var           package
1   ar     package:stats
2   as   package:methods
3   BD    package:fields
4   bs      package:VGAM
5   bs   package:splines
6   by      package:base
7    c      package:base
8    C     package:stats
9   cm package:grDevices
10   D     package:stats

ตอนนี้เราสามารถแบ่งข้อมูลตามแพ็คเกจ

 data.split <- split(var.data, var.data$package)

เราจะเห็นว่าตัวแปรส่วนใหญ่มาจากแพ็คเกจพื้นฐานและสถิติ

> unlist(lapply(data.split, nrow))
     package:base  package:datasets    package:fields 
               16                 1                 2 
  package:ggplot2 package:grDevices  package:gWidgets 
                2                 1                 1 
  package:lattice      package:MASS    package:Matrix 
                1                 1                 3 
  package:methods      package:mgcv      package:plyr 
                3                 2                 1 
     package:spam   package:splines     package:stats 
                1                 2                14 
 package:survival     package:utils      package:VGAM 
                1                 2                 4 

ในที่สุดการวาดภาพประจำ

plot(0, 0, "n", xlim=c(0, 100), ylim=c(0, 120), 
     xaxt="n", yaxt="n", xlab="", ylab="")

side.len.x <- 100 / length(data.split)
side.len.y <- 100 / max(unlist(lapply(data.split, nrow)))
colors <- rainbow(length(data.split), start=0.2, end=0.6)    

for (xcnt in 1:length(data.split))
    {
    posx <- side.len.x * (xcnt-1)

    # Remove "package :" in front of the package name
    pkg <- unlist(strsplit(as.character(data.split[[xcnt]]$package[1]), ":"))
    pkg <- pkg[2]

    # Write the package name
    text(posx + side.len.x/2, 102, pkg, srt=90, cex=0.95, adj=c(0, 0))

    for (ycnt in 1:nrow(data.split[[xcnt]]))
        {
        posy <- side.len.y * (ycnt-1)
        rect(posx, posy, posx+side.len.x*0.85, posy+side.len.y*0.9, col = colors[xcnt])
        text(posx+side.len.x/2, posy+side.len.y/2, data.split[[xcnt]]$var[ycnt], cex=0.7)
        }
    }

1
ดี! วิธีหนึ่งที่น่าสนใจในการทำสิ่งนี้คือการจัดกลุ่มตามหมวดหมู่ (เช่นแพ็คเกจกราฟิกการจัดการข้อมูล ฯลฯ ) รหัสสีจากนั้นทำให้รูปร่างโดยรวมมีลักษณะเหมือนกล่องมากกว่าแบบฮิสโตแกรม
Ari B. Friedman

+1 ช่างเป็นเรื่องดีจริงๆ! :) ทำงานได้ดีมาก ฉันเดาว่าสิ่งเดียวที่จำเป็นต้องมีเพื่อรับฟังก์ชั่นตารางธาตุคือเค้าโครงของตาราง PT มาตรฐานมี 2 กริดโดยองค์ประกอบบางอย่างหายไปใน 1 อันดับแรกและกลุ่มจะแบ่ง / จัดเรียงใหม่ (ตรงข้ามกับ 1 กลุ่ม = 1 คอลัมน์แนวตั้ง) พูดตามตรงนั่นไม่ใช่ส่วนที่ฉันคิดว่าจะยาก เลย์เอาต์การระบายสีและบล็อกเป็นส่วนที่ทำให้ฉันตื่นเต้นที่สุด & เป็นการดีที่ได้เห็นโค้ด ggplot2
Iterator

ฉันต้องการกาแฟ. ฉันเห็นว่า gsk3 มีความคิดเห็นแบบเดียวกันกับคำที่น้อยลง :) ฉันคิดว่าฉันหลงเสน่ห์ด้วยสี
Iterator

1
@Iterator: โปรดทราบว่ามันเป็นฟังก์ชั่นพล็อตมาตรฐาน R ทั้งหมดไม่มีส่วนเกี่ยวข้องกับ ggplot2 :)
nico

ปลาทูศักดิ์สิทธิ์ คุณถูก! น่าประทับใจยิ่งขึ้น ข้อสรุปของฉัน: ฉัน neeeeeeed coffeeeeeeeeeeeee
Iterator

4

นี่คือฮิสโตแกรมที่ใช้ตัวอักษร พิจารณาการปรับขนาดตัวอักษรตัวแรกตามหมายเลข แต่ตัดสินใจนับตั้งแต่ที่ถูกเข้ารหัสไปแล้วในองค์ประกอบแนวตั้ง

# "Load" data
nms <- c("Ad","am","ar","as","bc","bd","bp","br","BR","bs","by","c","C","cc","cd","ch","ci","CJ","ck","Cl","cm","cn","cq","cs","Cs","cv","d","D","dc","dd","de","df","dg","dn","do","ds","dt","e","E","el","ES","F","FF","fn","gc","gl","go","H","Hi","hm","I","ic","id","ID","if","IJ","Im","In","ip","is","J","lh","ll","lm","lo","Lo","ls","lu","m","MH","mn","ms","N","nc","nd","nn","ns","on","Op","P","pa","pf","pi","Pi","pm","pp","ps","pt","q","qf","qq","qr","qt","r","Re","rf","rk","rl","rm","rt","s","sc","sd","SJ","sn","sp","ss","t","T","te","tr","ts","tt","tz","ug","UG","UN","V","VA","Vd","vi","Vo","w","W","y") #all names
two_in_base <- c("ar", "as", "by", "cm", "de", "df", "dt", "el", "gc", "gl", "if", "Im", "is", "lh", "lm", "ls", "pf", "pi", "pt", "qf", "qr", "qt", "Re", "rf", "rm", "rt", "sd", "ts", "vi") # 2-letter names in base R
vowels <- c("a","e","i","o","u")
vowels <- c( vowels, toupper(vowels) )

# Constants
yoffset.singles <- 3

# Define a function to give us consistent X coordinates
returnX <- function(vec) {
  sapply(vec, function(x) seq(length(all.letters))[ x == all.letters ] )
}

# Make df of 2-letter names
combi <- nms[ sapply( nms, function(x) nchar(x)==2 ) ]
combidf <- data.frame( first = substr(combi,1,1), second=substr(combi,2,2) )
library(plyr)
combidf <- arrange(combidf,first,second)

# Add vowels
combidf$first.vwl <- (combidf$first %in% vowels)
combidf$second.vwl <- (combidf$second %in% vowels)

# Flag items only in base R
combidf$in_base <- paste(combidf$first,combidf$second,sep="") %in% two_in_base

# Create a data.frame to hold our plotting information for the first letters
combilist <- dlply(combidf,.(first),function(x) x$second)
combi.first <- data.frame( first = names(combilist), n = sapply(combilist,length) ,stringsAsFactors=FALSE )
combi.first$y <- 0
all.letters <-  c(letters,LETTERS) # arrange(combi.first,desc(n))$first to go in order of prevalence (which may break the one-letter name display)
combi.first$x <- returnX( combi.first$first )

# Create a data.frame to hold plotting information for the second letters
combidf$x <- returnX( combidf$first )
combidf$y <- unlist( by( combidf$second, combidf$first, seq_along ) )

# Make df of 1-letter names
sngldf <- data.frame( sngl = nms[ sapply( nms, function(x) nchar(x)==1 ) ] )
singles.y <- max(combidf$y) + yoffset.singles
sngldf$y <- singles.y
sngldf$x <- returnX( sngldf$sngl )

# Plot
library(ggplot2)
ggplot(data=combidf, aes(x=x,y=y) ) +
  geom_text(aes( label=second, size=3, colour=combidf$in_base ), position=position_jitter(w=0,h=.25)) +
  geom_text( data=combi.first, aes( label=first, x=x, y=y, size=4 ) ) +
  geom_text( data=sngldf, aes( label=sngl, x=x, y=y, size=4 ) ) +
  scale_size(name="Order (2-letter names)",limits=c(1,4),breaks=c(1,2),labels=c("Second","First")) +
  scale_x_continuous("",breaks=c(13,39),labels=c("lower","UPPER")) +
  scale_y_continuous("",breaks=c(0,5,singles.y),labels=c("First letter of two-letter names","Second letter of two-letter names","One-letter names") ) +
  coord_equal(1.5) +
  labs( colour="In base R" )

เวอร์ชันที่มีชื่อหนึ่งและสองตัวอักษรในพล็อตเดียวกัน

ฮิสโตแกรมที่ใช้ตัวอักษร


2

ตารางธาตุสำหรับ 100, Alex แต่ฉันไม่มีรหัสสำหรับมัน :(

อาจคิดว่าแพ็คเกจ "ตารางธาตุ" อาจมีอยู่ใน CRAN แล้ว แนวคิดของรูปแบบการระบายสีและเค้าโครงของข้อมูลดังกล่าวอาจน่าสนใจและมีประโยชน์

สิ่งเหล่านี้อาจเป็นสีตามแพคเกจและเรียงตามแนวตั้งตามความถี่เช่นในตัวอย่างของรหัสบน CRAN หรือตามที่ปรากฏในรหัสฐานท้องถิ่นของตน


ไม่แน่ใจว่าถ้าฉันติดตามคุณ ... คุณช่วยวาดภาพร่างที่เรียบง่ายของสิ่งที่คุณกำลังคิดได้หรือไม่? ผมไม่เห็นว่ารูปแบบตารางธาตุจะช่วยให้ที่นี่ ...
นิโก้

@ นิโก้: ฉันกำลังคิดบางอย่างเช่นนี้: en.wikipedia.org/wiki/Periodic_table สมมติว่าเราแทนที่ "องค์ประกอบโนเบล" ด้วยคำสั่งฐาน R ฮาโลเจนอาจถูกแทนที่ด้วยแพ็คเกจของตัวเองและอื่น ๆ ด้วยแพ็คเกจการสร้างภาพข้อมูลฉันจะปล่อยให้ผู้ใช้ระบุลักษณะของแถวคอลัมน์กลุ่มและการระบายสี มันควรจะเป็นสิ่งที่ค่อนข้างง่ายในการนำไปใช้แม้ว่าฉันจะทำมันเลวร้ายมาก ตำแหน่งจะเป็นเช่นนั้นรายการในกลุ่มเดียวกัน (เช่นแพ็คเกจ) อยู่ใกล้กัน ตำแหน่งในแนวตั้งสามารถพิจารณาได้จากความถี่การใช้งาน
Iterator

โอเคตอนนี้ฉันเข้าใจแล้ว! บางทีฉันอาจลองดูว่าฉันสามารถออกมาพร้อมกับบางสิ่งบางอย่างได้หรือไม่ แต่ฉันต้องหาเวลาว่างก่อน ... :(
nico

ฉันยังไม่เห็นมัน แต่ฉันตื่นเต้นที่จะเห็นว่าความคิดนี้เปลี่ยนเป็น :-)
Ari B. Friedman

1
ลองดู stackexchange: Tal Galili ถามเกี่ยวกับ PSE มาก่อนแล้วดังนั้นฉันจึงไม่ถาม แต่ฉันเพิ่งผลักรหัสบิตแรกไปที่ r-forge: pse.R โปรดใส่ดาวรอบการเช็คเอาต์ - ฉันไม่รู้วิธีหลบหนีพวกเขาดังนั้นพวกเขาจึงหายตัวไป ...
cbeleites ไม่มีความสุขกับ SX

1

สองหน้าแรกในบทที่ 2 ของ ITILA ของ MacKayมีไดอะแกรมที่แสดงความน่าจะเป็นเงื่อนไขของการจับคู่อักขระทั้งหมดในภาษาอังกฤษ คุณอาจพบว่ามันใช้งานได้

ฉันอายที่จะบอกว่าฉันจำไม่ได้ว่าโปรแกรมใดที่ใช้สร้างพวกมัน


1
มันเจ๋ง แต่มันก็ดูดีสำหรับฉันเหมือนว่าทั้งหมดนั้นขึ้นอยู่กับการมีข้อมูลเพิ่มเติม (ความชุก) ที่เกี่ยวข้องกับคู่ตัวอักษรแต่ละตัว ดังนั้นเขาจึงสร้างกราฟ 3 มิติในขณะที่เราทำกราฟเป็นหลัก 2 .... ฉันชอบที่จะมีข้อมูลที่แพร่หลายสำหรับ R แม้ว่า แต่นั่นเป็นการดำเนินการขุดข้อมูลอีกวัน
Ari B. Friedman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.