【问题标题】:Better way of calculating values for rows of a data frame计算数据框行值的更好方法
【发布时间】:2016-01-26 15:21:57
【问题描述】:

我正在尝试计算数据框中行的值。 基本上我有一个数据框,其中包含 5 列,0 或 1(存在/不存在)。我想在这 5 列上随机化这些值的顺序,对这些列应用计算,将其复制 1000 次,然后计算每列不同计算的平均值,然后将这些值相加成每行一个值。

我尝试使用 lapply 和 apply 执行此操作,但不知何故无处可去。我设法用 for 循环做到了,但我想知道是否有更短/更好的方法。

这就是我最终得到的并根据需要工作:

> df <- data.frame(t(replicate(10,sample(c(0,1),5,replace=TRUE))))
> df
   X1 X2 X3 X4 X5
1   1  1  0  1  1
2   1  1  1  0  0
3   0  0  0  1  0
4   0  1  1  1  0
5   0  0  1  0  1
6   0  1  1  1  0
7   0  0  1  0  1
8   0  0  0  0  1
9   1  0  0  1  0
10  0  1  0  1  1
> for (i in 1:nrow(df)){
+   v<-sum(
+     rowMeans(
+       replicate(1000,{
+         sample(as.numeric(df[i,c("X1","X2","X3","X4","X5")]),5, replace=FALSE)*c(5,4,3,2,1)
+       }
+       )
+     )
+   )
+   df[i,c("tot")]<-v
+ }
> df
   X1 X2 X3 X4 X5     tot
1   1  1  0  1  1 12.0184
2   1  1  1  0  0  8.9786
3   0  0  0  1  0  3.0138
4   0  1  1  1  0  9.0013
5   0  0  1  0  1  6.0196
6   0  1  1  1  0  9.0227
7   0  0  1  0  1  5.9837
8   0  0  0  0  1  3.0063
9   1  0  0  1  0  6.0069
10  0  1  0  1  1  9.0032

【问题讨论】:

    标签: r


    【解决方案1】:

    使用apply

    df$tot <- apply(df, 1, function(x) {
      sum(
        rowMeans(
           replicate(
             1000, sample(x, 5, replace=F)*5:1
           )
        )
     )
    })
    

    【讨论】:

    • 这很棒。我不知道为什么我不能让它工作。我想有这么多的方法来处理所有的 apply 系列函数,我不再看到显而易见的事情了。还有一个问题,有没有办法用 lapply 做到这一点,因为这样我就可以利用 mclapply 的多核。
    • .. 喜欢lapply(as.data.frame(t(df)), function(x) {...?可悲的是,我从来没有在我的 PC 上运行多核的东西。
    • 太棒了,效果也很好。现在开始多核挑战:)。
    • 现在有点跑题了,但我只是包含了并行包并用 lapply 替换了 mclapply 并且它起作用了。我可以看到两个核心将 100% 使用,而不是之前的一个,而且结果要快得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2022-11-23
    • 2012-08-02
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多