我有4个数据框,其中包含来自不同实验的数据,其中每行代表一个试验。参与者的ID(SID)存储为因子。每个数据框都如下所示:
实验1:
SID trial measure
5402 1 0.6403791
5402 2 -1.8515095
5402 3 -4.8158912
25403 1 NA
25403 2 -3.9424822
25403 3 -2.2100059
我想创建一个新数据框,其中包含每个实验中参与者的ID,例如:
Exp1 Exp2 Exp3 Exp4
5402 22081 22160 25434
25403 22069 22179 25439
25485 22115 22141 25408
25457 22120 22185 25445
28041 22448 22239 25473
29514 22492 22291 25489
我希望每列都以数字的形式排序,即2在10之前。
我使用 unique()来提取每个数据框中的参与者ID(SID),但是我在排序列时遇到了问题。
我尝试使用:
data.frame(order(unique(df1$SID)),
order(unique(df2$SID)),
order(unique(df3$SID)),
order(unique(df4$SID)))
我得到(没有列名):
38 60 16 32 15
2 9 41 14 41
3 33 5 30 62
4 51 11 18 33
如果我遗漏了一些非常基本的东西,我很抱歉,我还是R的新手。
感谢您的帮助!
编辑: 我在评论中尝试了解决方案,现在我已经:
x<-cbind(sort(as.numeric(unique(df1$SID)),decreasing = F),
sort(as.numeric(unique(df2$SID)),decreasing = F),
sort(as.numeric(unique(df3$SID)),decreasing = F),
sort(as.numeric(unique(df4$SID)),decreasing = F) )
仍然不起作用......我明白了:
V1 V2 V3 V4
8 6 5 2
2 9 35 11 3
3 10 37 17 184
4 13 38 91 185
5 15 39 103 186
主题ID是3到5位数字......
答案 0 :(得分:2)
如果您的数据如下所示:
df <- read.table(text="
SID trial measure
5402 1 0.6403791
5402 2 -1.8515095
5402 3 -4.8158912
25403 1 NA
25403 2 -3.9424822
25403 3 -2.2100059",
header=TRUE, colClasses = c("factor","integer","numeric"))
我会做这样的事情:
df <- df[order(as.numeric(as.character(df$SID)), trial),] # sort df on SID (numeric) & trial
split(df$SID, df$trial) # breaks the vector SID into a list of vectors of SID for each trial
如果你担心可以做的独特价值:
lapply(split(df$SID, df$trial), unique) # breaks SID into list of unique SIDs for each trial
这将为您提供每个试验的参与者ID列表,按数值排序但保持其因子属性。
如果您真的想要一个数据框,并且每个实验中的参与者人数相等,您可以在列表中使用data.frame()
,如:data.frame(split(df$SID, df$trial))
答案 1 :(得分:0)
假设x和y代表Exp1 SID和Exp2 SID。您可以创建唯一值的有序列表,如下所示:
x<-factor(x = c(2,5,4,3,6,1,4,5,6,3,2,3))
y<-factor(x = c(2,3,4,2,4,1,4,5,5,3,2,3))
list(exp1=sort(x = unique(x),decreasing = F),y=sort(x = unique(y),decreasing = F))