R 存储为因子的数值排序列表
我有4个数据帧,数据来自不同的实验,每一行代表一次试验。参与者的id(SID)存储为一个因子。每个数据帧如下所示: 实验1:R 存储为因子的数值排序列表,r,sorting,R,Sorting,我有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 我想用每个实验参与者的i
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)))
我得到(没有列名):
我很抱歉,如果我遗漏了一些非常基本的东西,我对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) )
主题id是3到5位数字…如果您的数据如下所示:
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
这将为您提供每个试验的参与者ID列表,按数值排序,但保留其factor属性
如果您确实想要一个数据帧,并且每个实验的参与者数量相等,那么可以在列表中使用
data.frame()
,如:data.frame(split(df$SID,df$trial))
假设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))
xI不理解您所面临的问题,请明确您期望的是什么以及您得到的是什么为什么您想要一个data.frame而不仅仅是每个实验的ID列表?使用data.frame表明(1)每个实验中的参与者数量相同,(2)给定行中的参与者有相同的内容common@vdep我用您询问的信息更新了问题@C8H10N4O2,它不需要是数据帧,我只是想要一张有谁参与了什么实验的表格。@Sininho没错,你可以通过as.numeric(as.character(x))
正确地进行强制。参见下面的解决方案。这里的关键概念是因子如何工作。在内部,因子是一个整数1,2。。。。n
表示不同级别的n
。如果变量是subject
,那么这些级别可能类似于c(“数学”、“化学”、“哲学”)
,但更令人困惑的是,它们可能类似于c(“5402”、“2543”)
,因此要获得c(54022543)
而不是c(1,2)
首先需要将其作为字符串获取(要删除c(1,2)
representation),然后将其作为数字读回。
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
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))