1

我有一个 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 个数字的总和,另一列必须具有第一列中未选择的剩余值的总和随机抽样。

非常感谢您的帮助。提前致谢

4

2 回答 2

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
于 2012-06-08T22:55:14.500 回答
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为其他列(显然,再次排除“主题”);然后返回一个数据框,其中包含主题列表、所选列的总和以及未选择列的总和。完毕。

于 2012-06-08T23:34:17.930 回答