我有一个包含多个列和行的表。我想通过column name
和rowname
访问每个值,并使用这些值制作一个图。
该表与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
将其他考试与Exam2
,3
和100
进行比较的方式的分布。
我几乎用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'
个分数与其他分数相比(如果它是一个空白,那么它不应该被视为零。它仍然是一个空白。)
红色:考试3,100和2,蓝色:其余97项考试的分数 (代码和图是作为this link的ggplot2的一个例子。)
所有想法都表示赞赏!
答案 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 选择考试。请考虑以下步骤:
by()
子集数据并构建平均聚合数据和ggplots。by
内,在选择考试上创建 SelectValues 指标列,然后使用垂直线平均求和图。数据强>
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)
})
<强>输出强>