我有一个包含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个数字的总和(除了主题),而另一列必须具有在第一列中未选择的剩余值的总和。随机样本。
非常感谢帮助。 提前致谢
答案 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
定义为其他列(显然,再次排除“主题”);然后返回一个数据框,其中包含主题列表,所选列的总和以及未选择列的总和。完成。