按其rowname和columnname访问值,而不是数字

时间:2018-03-01 14:35:39

标签: r plot ggplot2 datatable

我有一个包含多个列和行的表。我想通过column namerowname访问每个值,并使用这些值制作一个图。

该表与101 columns

相似
IDs     Exam1  Exam2 Exam3 Exam4 .... Exam100
Ellie   12            48    33         64
Kate    98      34    21    76         
Joe     22      53    49               72        
Van     77            40    12
Xavier                      88         92

我想要的是能够达到给定row(ID)的标记,并且给出column(考试):

table[Ellie,Exam3] --> 48
table[Ellie,Exam100] --> 64
table[Ellie,Exam2] -->     (empty)

然后,根据这些数字,我想看看Ellie将其他考试与Exam23100进行比较的方式的分布。

我几乎用R:

想出了这一部分
library(data.table)
library(ggplot2)
pdf("distirbution_given_row.pdf")
selectedvalues <- c(table[Ellie,Exam3] ,table[Ellie,Exam100]) 
library(plyr)
cdat <- ddply(selected values, "IDs", summarise, exams.mean=mean(exams))
selectedvaluesggplot <- ggplot(selectedvalues, aes(x=IDs, colour=exams)) + geom_density() + geom_vline(data=cdat, aes(xintercept=exams.mean, colour=IDs), linetype="dashed", size=1)
dev.off()

哪个应该为感兴趣的考试生成Ellie'个分数与其他分数相比(如果它是一个空白,那么它不应该被视为零。它仍然是一个空白。)

Red: Marks for Exam3 and 100 and 2 , Blue: The marks for the rest 97 exams

红色:考试3,100和2,蓝色:其余97项考试的分数 (代码和图是作为this link的ggplot2的一个例子。)

所有想法都表示赞赏!

2 个答案:

答案 0 :(得分:2)

至少要访问您的数据,您可以执行以下操作:

df=data.frame(IDs=c("Ellie","Kate","Joe","Van","Xavier"),Exam1=c(12,98,22,77,NA),Exam2=c(NA,34,53,NA,NA),
                  Exam3=c(48,21,49,40,NA),Exam4=c(33,76,NA,12,88))

row.names(df)=df$IDs

df=df%>%select(-IDs)

> df['Joe','Exam2']
[1] 53

现在我准备了一个随机创建数字的例子来说明你可以做些什么。首先让我们创建一个示例数据框

df=as.data.frame(matrix(rnorm(505,50,10),ncol=101))
colnames(df)=c("IDs",paste0("Exam",as.character(1:100)))
df$IDs=c("Ellie","Kate","Joe","Van","Xavier")

要使用ggplot,建议将其转换为长格式:

df0=df%>%gather(key="exams",value="score",-IDs)

从这里开始,您可以根据需要使用变量。例如,绘制每个ID的得分密度:

ggplot(df0, aes(x=score,col=IDs)) + geom_density()

或仅选择考试2,3,100并绘制不同考试的密度

df0=df0%>%filter(exams=="Exam2"|exams=="Exam3"|exams=="Exam100")
ggplot(df0, aes(x=score,col=exams)) + geom_density()

答案 1 :(得分:0)

IIUC - 您希望使用所有其他考试来绘制每个ID 选择考试。请考虑以下步骤:

  1. 将数据重新整理为长格式,甚至根据需要将零替换为零。
  2. 按ID运行by()子集数据并构建平均聚合数据和ggplots。
  3. by内,在选择考试上创建 SelectValues 指标列,然后使用垂直线平均求和图。
  4. 数据

    txt = 'IDs     Exam1  Exam2 Exam3 Exam4 Exam100
    Ellie   12      NA      48    33         64
    Kate    98      34      21    76         NA
    Joe     22      53      49    NA         72        
    Van     77      NA      40    12         NA
    Xavier  NA      NA      NA    88         92'
    
    exams_df <- read.table(text=txt, header = TRUE) 
    
    # ADD OTHER EXAM COLUMNS (SEEDED FOR REPRODUCIBILITY)
    set.seed(444)
    exams_df[paste0("Exam", seq(5:99))] <- replicate(99-4, sample(100, 5))
    

    重塑和图表

    library(ggplot2)        # ONLY PACKAGE NEEDED
    
    # FILL NA
    exams_df[is.na(exams_df)] <- 0
    
    # RESHAPE (BASE R VERSION)
    exams_long_df <- reshape(exams_df, 
                             timevar =  "Exam", 
                             times = names(exams_df)[grep("Exam", names(exams_df))],
                             v.names = "Score",
                             varying = names(exams_df)[grep("Exam", names(exams_df))], 
                             new.row.names = 1:1000,
                             direction = "long")
    
    # GRAPH BY EACH ID    
    by(exams_long_df, exams_long_df$IDs, FUN=function(df) {
    
      df$SelectValues <- ifelse(df$Exam %in% c("Exam1", "Exam3", "Exam100"), "Select Exams", "All Else")
    
      cdat <- aggregate(Score ~ SelectValues, df, FUN=mean)
    
      ggplot(df, aes(Score, colour=SelectValues)) + 
        geom_density() + xlim(-50, 120) +
        labs(title=paste(df$IDs[[1]], "Density Plot of Scores"), x ="Exam Score", y = "Density") +
        geom_vline(data=cdat, aes(xintercept=Score, colour=SelectValues), linetype="dashed", size=1)
    
    })
    

    <强>输出

    enter image description here