从行中随机求和值并将它们分配给R中的2列

时间:2012-06-08 22:44:57

标签: r random sum dataframe

我有一个包含8列的data.frame。一个是主题列表(每个主题一行),另外7行是1或0的分数。 这就是数据的样子:

>head(splitkscores)
  subject block3 block4 block5 block6 block7 block8 block9
1   40002      0      0      1      0      0      0      0
2   40002      0      0      1      0      0      1      1
3   40002      1      1      1      1      1      1      1
4   40002      1      1      0      0      0      1      0
5   40002      0      1      0      0      0      1      1
6   40002      0      1      1      0      1      1      1

我想创建一个包含3列的data.frame。一栏为主题。在另外两列中,一个必须具有从我的data.frame的每一行中随机选择的3或4个数字的总和(除了主题),而另一列必须具有在第一列中未选择的剩余值的总和。随机样本。

非常感谢帮助。 提前致谢

2 个答案:

答案 0 :(得分:0)

我认为这样做:[改变了根据其他响应读入数据的方式,因为我犯了一个手动错误......]

   splitkscores <- read.table(text = "  subject block3 block4 block5 block6 block7 block8 block9
1   40002      0      0      1      0      0      0      0
2   40002      0      0      1      0      0      1      1
3   40002      1      1      1      1      1      1      1
4   40002      1      1      0      0      0      1      0
5   40002      0      1      0      0      0      1      1
6   40002      0      1      1      0      1      1      1", header = TRUE)

   df2 <- data.frame(subject = splitkscores$subject, sum3or4 = NA, leftover = NA)
   df2$sum3or4 <- apply(splitkscores[,2:ncol(splitkscores)], 1, function(x){
       sum(sample(x, sample(c(3,4),1), replace = FALSE))
     })
   df2$leftover <- rowSums(splitkscores[,2:ncol(splitkscores)]) - df2$sum3or4

   df2
     subject sum3or4 leftover
   1   40002       1        0
   2   40002       2        1
   3   40002       3        4
   4   40002       1        2
   5   40002       2        1
   6   40002       1        4

答案 1 :(得分:0)

这是一个干净整洁的解决方案,没有不必要的复杂性(假设输入被称为df):

chosen=sort(sample(setdiff(colnames(df),"subject"),sample(c(3,4),1)))
notchosen=setdiff(colnames(df),c("subject",chosen))
out=data.frame(subject=df$subject,
               sum1=apply(df[,chosen],1,sum),sum2=apply(df[,notchosen],1,sum))

简单英语:来自“主题”以外的列名称的样本,选择3或4的样本大小,并调用这些列名称chosen;将notchosen定义为其他列(显然,再次排除“主题”);然后返回一个数据框,其中包含主题列表,所选列的总和以及未选择列的总和。完成。