【问题标题】:How to get rowSums for selected columns in R如何获取R中选定列的rowSums
【发布时间】:2016-05-07 06:42:01
【问题描述】:

我是 R 的新手,并寻求帮助来计算每一行的选定列的总和。我的简单数据框如下。

data = data.frame(location = c("a","b","c","d"),
            v1 = c(3,4,3,3), v2 = c(4,56,3,88), v3 =c(7,6,2,9), v4=c(7,6,1,9),
            v5 =c(4,4,7,9), v6 = c(2,8,4,6))

我想要新数据框中每一行的 V1 到 V3 和 V4 到 V6 列的总和。

   x1   x2
a  14   13   
b  66   18
c
d

我做了类似下面的事情。

rowSums(data[,2:4][,5:7])

但是我的代码应该有问题。提前感谢您的帮助。

【问题讨论】:

    标签: r rowsum


    【解决方案1】:

    我的感觉是使用 dply:

    require(dply)
    data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6))
    

    结果:

    > newDf <- data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6))
    > newDf
      v2v4 v4v6
    1   14   13
    2   66   18
    3    8   12
    4  100   24
    

    【讨论】:

      【解决方案2】:

      这是一个使用apply 的非常简单的解决方案。

      output <- data.frame( x1 = apply(data[2:4], 1, sum) ,
                            x2 = apply(data[5:7], 1, sum) )
      

      结果:

      output
      >    x1 x2
      > 1  14 13
      > 2  66 18
      > 3   8 12
      > 4 100 24
      

      【讨论】:

        【解决方案3】:
        rowSums(cbind(mydata$variable1, mydata$variable2, mydata$variable3), na.rm = T )
        

        【讨论】:

          【解决方案4】:

          好的,如果你想要一个单独的数据框:

          > data.frame(X1=rowSums(data[,2:4]), X2=rowSums(data[,5:7]))
          

          【讨论】:

          • 此答案未在data.frame中返回所需的输出
          • 我从来没有说过。我说过你需要使用 rowSums(data[,c(2:4,5:7)]) 而不是 rowSums(data[,2:4][,5:7])。如果你想要一个数据框,你只需要将它组合起来。
          • 我仍然认为您的答案不会返回问题中要求的结果,这将是 data.frame 就像您在其他答案中看到的那样
          • 你确定吗?检查结果,它是一个data.frame
          • 是的,它现在返回一个 data.frame,但它仍然没有返回问题中指示的所需输出。
          【解决方案5】:

          明确指定两个总和:

          cbind(x1=rowSums(data[,c('v1','v2','v3')]),x2=rowSums(data[,c('v4','v5','v6')]));
          ##       x1 x2
          ## [1,]  14 13
          ## [2,]  66 18
          ## [3,]   8 12
          ## [4,] 100 24
          

          【讨论】:

          • 实际数据集有大量变量。
          【解决方案6】:

          我们可以将split 数据集转换成list,然后使用Reducef="+"

          sapply(split.default(data[-1], rep(paste0("x", 1:2), each=3)), Reduce, f=`+`)
          #     x1 x2
          #[1,]  14 13
          #[2,]  66 18
          #[3,]   8 12
          #[4,] 100 24
          

          【讨论】:

          • 所有答案都很好。谢谢 。 @Akrun Reduce, f='+' 在这里做什么?
          • @Lio fReduce 内部的函数调用。它对 data.frame 的特定行中的每个元素进行求和。
          【解决方案7】:

          所以,我遇到了类似的问题

          我在 2 个不同的时间对 20 个问题进行了相同的调查,因此有 2 个不同的调查分数,总共 40 列。每个调查问题都以标识符结尾。因此,例如,调查的第一个问题通过添加 .a 或 .c 来区分:

          Survey1Question1.a
          Survey1Question1.c
          

          假设您的数据在 df1 中,并且您想对每个调查中的所有列求和,以便获得 2 个调查分数:

          df1 %>% mutate(Survey.A = rowSums(.[grepl('\\.a$',colnames(.))]),
                  Survey2 = rowSums(.[grepl('\\.c$',colnames(.))]),
                  )
          
          # A tibble: 9 x 2
            Survey.A Survey.C
               <dbl>   <dbl>
          1       64      51
          2       89      91
          3       62      60
          4       80      80
          5       66      69
          6       60      61
          7       71      74
          8       52      50
          9       79      69
          

          我只是在学习如何使用 '.'点符号。但我相信这是可行的,因为 rowSums 需要一个数据框。 Which means you can follow Technophobe1's answer 以上。但是诀窍就变成了如何以编程方式做到这一点。

          嗯,第一个'.'在 rowSums 中是管道 (df1) 传递的数据集中的完整列/变量集。但是您想对其进行子集化。

          所以,这里是 grepl 运作良好的地方。您可以使用 grepl 使用以下语法对数据帧进行子集化:dataframe[,grepl("pattern",colnames(dataframe))]

          所以,在我上面rowSums(.[grepl('\\.a$',colnames(.))]) 的代码中,诀窍是用“。”替换“数据帧”。点符号。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多