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

我有一堆数据帧,在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 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
be
NA
?然后是
Hit2RT
be
36.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")