R中数据帧的合并和转换
我有一堆数据帧,在R中是这样的:R中数据帧的合并和转换,r,csv,dataframe,data-processing,R,Csv,Dataframe,Data Processing,我有一堆数据帧,在R中是这样的: print(output[2]) Button Intensity Acc Intensity RT Time tdelta SubjectID CoupleID PrePost 1: 0 30 0 0.0 0 83325.87 0.000 1531 153 Post 2: 1 30 1 13.5 0 83362.65 36.782 1531
print(output[2])
Button Intensity Acc Intensity RT Time tdelta SubjectID CoupleID PrePost
1: 0 30 0 0.0 0 83325.87 0.000 1531 153 Post
2: 1 30 1 13.5 0 83362.65 36.782 1531 153 Post
3: 1 30 1 15.0 0 83376.68 14.027 1531 153 Post
4: 1 30 1 6.0 0 83392.27 15.585 1531 153 Post
5: 1 30 1 15.0 0 83398.77 6.507 1531 153 Post
print(output[1])
[[1]]
Button Intensity Acc Intensity RT Time tdelta SubjectID CoupleID PrePost
1: 0 30 0 0.0 0 77987.93 0.000 1531 153 Pre
2: 1 30 1 13.5 0 78084.57 96.639 1531 153 Pre
3: 1 30 1 15.0 0 78098.62 14.054 1531 153 Pre
4: 1 30 1 6.0 0 78114.13 15.508 1531 153 Pre
5: 1 30 1 15.0 0 78120.67 6.537 1531 153 Pre
我想将它们组合成一个大数据框架,具有以下逻辑和格式:
SubjectID CoupleID PrePost Miss1RT Miss2RT Miss3RT Hit1RT Hit2RT Hit3RT
1531 153 Post 0.00 NA NA NA 36.78 14.027
1531 153 Pre 0.00 NA NA NA 96.638 14.054
如果按钮==0,则未命中;如果按钮==1,则命中。所以,应该是这样的:
for row in output[i].rows:
if Button ==0:
Miss1RT ==tdelta
elif Button ==1;
Miss1RT =='NA'
然后是一个翻转版本,如果按钮为1,则点击[i]RT为tdelta或“NA”
每个数据帧有26行,每行是命中或未命中,因此将有26个未命中和26个命中列,每个SubjectID获得两行-一行用于Pre,一行用于Post。因此,最终输出的列标题为:
SubjectID CoupleID PrePost Miss1RT Miss2RT ...Miss26RT Hit1RT Hit2RT ... Hit26RT
我是R新手,正在努力学习正确的语法 像这样的方法应该会奏效:
#Get data in structure OP has
output <- list(pre, post)
output2 <- lapply(output, function(x) cbind(x, num = paste0(1:nrow(x), "RT")))
pre_post <- do.call("rbind", output2)
#Perform actual calculations
pre_post$miss <- ifelse(pre_post$Button == 0, pre_post$tdelta, NA)
pre_post$hit <- ifelse(pre_post$Button == 1, pre_post$tdelta, NA)
pre_post_melted <- melt(pre_post, id.vars = c("SubjectID", "CoupleID", "num", "PrePost"), measure.vars = c("hit","miss"))
pre_post_res <- dcast(pre_post_melted, SubjectID + CoupleID + PrePost ~ variable + num, sep = "")
pre_post_res
#SubjectID CoupleID PrePost hit_1RT hit_2RT hit_3RT hit_4RT hit_5RT miss_1RT miss_2RT miss_3RT miss_4RT miss_5RT
#1 1531 153 Post NA 36.782 14.027 15.585 6.507 0 NA NA NA NA
#2 1531 153 Pre NA 96.639 14.054 15.508 6.537 0 NA NA NA NA
#获取OP has结构中的数据
输出您是否只想查看前两个命中
和未命中
?还是你想看看所有可能的?也就是说,您是否希望为您的Post
,CoupleID=153
设置一个Hit2RT=15.585
?我希望为每个Pre/Post主语设置一个Hit1-26RT,为Miss1-26RT设置一个相同的Hit1-26RT,以便26按钮==1或0行中的每一行在Hit[I]RT或Miss[I]RT中创建一个数字,在另一行创建一个“NA”。为了清晰起见,编辑了这篇文章。Hit1RT
beNA
?然后是Hit2RT
be36.78
?是的。让我来解决这个问题。看起来第一步是组合数据帧的“pre”和“post”列表,但它们都只是在一个数据帧列表“output”中。当我尝试output$miss@HeatherCohen时,这是因为它听起来像output
是一个列表。尝试堆叠output$pre
和output$post
或者在您的示例中堆叠output[[1]]
和output[[2]]
因为列表中有13个数据帧output
并且将来可能会更多,所以我将其更改为:df这是因为您需要num
列。您可以使用lappy(输出,函数(x)cbind(x,num=paste0(1:nrow(x),“RT”))在列表中的每个数据帧上创建它。
pre <- structure(list(Button = c(0L, 1L, 1L, 1L, 1L), Intensity = c(30L,
30L, 30L, 30L, 30L), Acc = c(0L, 1L, 1L, 1L, 1L), Intensity = c(0,
13.5, 15, 6, 15), RT = c(0L, 0L, 0L, 0L, 0L), Time = c(77987.93,
78084.57, 78098.62, 78114.13, 78120.67), tdelta = c(0, 96.639,
14.054, 15.508, 6.537), SubjectID = c(1531L, 1531L, 1531L, 1531L,
1531L), CoupleID = c(153L, 153L, 153L, 153L, 153L), PrePost = c("Pre",
"Pre", "Pre", "Pre", "Pre")), .Names = c("Button", "Intensity",
"Acc", "Intensity", "RT", "Time", "tdelta", "SubjectID", "CoupleID",
"PrePost"), row.names = c(NA, -5L), class = "data.frame")
post <- structure(list(Button = c(0L, 1L, 1L, 1L, 1L), Intensity = c(30L,
30L, 30L, 30L, 30L), Acc = c(0L, 1L, 1L, 1L, 1L), Intensity = c(0,
13.5, 15, 6, 15), RT = c(0L, 0L, 0L, 0L, 0L), Time = c(83325.87,
83362.65, 83376.68, 83392.27, 83398.77), tdelta = c(0, 36.782,
14.027, 15.585, 6.507), SubjectID = c(1531L, 1531L, 1531L, 1531L,
1531L), CoupleID = c(153L, 153L, 153L, 153L, 153L), PrePost = c("Post",
"Post", "Post", "Post", "Post")), .Names = c("Button", "Intensity",
"Acc", "Intensity", "RT", "Time", "tdelta", "SubjectID", "CoupleID",
"PrePost"), row.names = c(NA, -5L), class = "data.frame")