【问题标题】:randomly sum values from rows and assign them to 2 columns in R随机对行中的值求和并将它们分配给 R 中的 2 列
【发布时间】:2012-06-12 23:40:09
【问题描述】:

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

非常感谢您的帮助。 在此先感谢

【问题讨论】:

  • 主题是否应该逐行不同?
  • 每个科目的 3 列还是 4 列的选择应该相同吗?

标签: r random sum dataframe


【解决方案1】:

这是一个整洁的解决方案,没有不必要的复杂性(假设输入称为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 定义为其他列(显然,再次排除“主题”);然后返回一个数据框,其中包含主题列表、所选列的总和以及未选择列的总和。完成。

【讨论】:

  • 我用过这个 >chosen=sort(sample(setdiff(colnames(splitkscores),"subject"),sample(c(3,4),1))) >notchosen=setdiff(colnames( splitkscores),c("subject",chosen)) > out=data.frame(subject=splitkscores$subject, + sum1=apply(splitkscores[,chosen],1,sum),sum2=apply(splitkscores[,notchosen] ,1,sum)) 显然它起作用了(至少我的相关性现在更有意义了)非常感谢!
  • 据我所知,这里的区别在于我的代码为每行随机选择 3 或 4 列,而此代码始终使用 3 或 4 列,它们是相同的列整个操作。
  • 是的,因为使用一组一致的列具有更多的数学和统计意义。代码也更干净恕我直言,但这些事情有点主观:)
  • 没问题 Hernan,很高兴为您提供帮助 :)
【解决方案2】:

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

   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

【讨论】:

  • 非常感谢您的快速回复。我应该澄清我在呈现我的原始数据时犯了一个错误。主题列被错误地指定,该列的每一行都是不同的主题,所以我没有使用你代码的第一部分。您的代码的第二部分,我稍微修改它以包含从 2 到 8 的列,而不是 2:7,这会留下一列。制作的数据确实是我正在寻找的。非常感谢您的帮助和优雅的代码。
  • 我不是 100% 确定它是。您是否希望列的样本逐行不同?我想不出(基于我目前的想象,为什么你可能想要做这种操作)。 span>
  • 例如,第 5 行的 sum3or4 大于第 6 行,如果列的子集被选中一次,则永远不会发生这种情况。为每一行单独的示例感觉不应该做正确的事情(例如,如果您尝试做一些引导类型的东西)。
  • 是的,我改变了7到ncol(splitkscores)让它更灵活。 7是由于我的原始邋manual forgion splitkscores。很高兴它有用
  • 我这样做是为了做出评分方法的分裂半相关性。基于公式分配给每个对象的1S和0。我现在正在做的是计算每个主题对两半数据的分数,看看它们是否相关,这将显示内部一致性。 r 出乎意料地低,这让我觉得我最初在这个例子中使用的代码不太正确(显然是我的错)。我在另一个答案中使用了Tim P提供的代码,我认为它有效。请在Tim P的回答中查看我的最终解决方案的评论。非常感谢
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2012-03-19
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多