【问题标题】:mutate rowSums exclude one column变异 rowSums 排除一列
【发布时间】:2015-05-06 18:44:00
【问题描述】:

我有一个这样的数据框

> df
Source: local data frame [4 x 4]

      a x y z
1 name1 1 1 1
2 name2 1 1 1
3 name3 1 1 1
4 name4 1 1 1

想要通过添加列 x、y 和 z 来改变它(可以有更多的数字列)。尝试按如下方式排除“a”列是行不通的。

dft <- df %>% mutate(funs(total = rowSums(.)), -a)
Error: not compatible with STRSXP

这也会产生错误:

dft <- df %>% mutate(total = rowSums(.), -a)
Error in rowSums(.) : 'x' must be numeric

什么是正确的方法?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果您想在结果中保留非数字列,您可以这样做:

    dat %>% mutate(total=rowSums(.[, sapply(., is.numeric)]))
    

    更新:现在dplyrscoped versions 的标准动词,这里有另一种选择:

    dat %>% mutate(total=rowSums(select_if(., is.numeric)))
    

    更新 2: 使用 dplyr 1.0,上述方法仍然有效,但您也可以通过组合 rowwisec_across 来进行行求和:

    iris %>% 
      rowwise %>% 
      mutate(row.sum = sum(c_across(where(is.numeric))))
    

    【讨论】:

      【解决方案2】:

      您可以在对 rowSums() 的调用中使用带有 select() 的丰富选择器

      df %>% transmute(a, total = rowSums(select(., -a)))
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        #dummy data    
        df <- read.table(text="a x y z
        
        1 name1 1 1 1
        2 name2 1 1 1
        3 name3 1 1 1
        4 name4 1 1 1",header=TRUE)
        
        library(dplyr)
        
        df %>% select(-a) %>% mutate(total=rowSums(.)) 
        

        首先排除文本列 - a,然后对剩余的数字列执行 rowSums

        【讨论】:

        • 我试过了,但结果数据框错过了 a 列。我想保留它。添加回来是唯一的选择吗?
        • @user3949008 查看 eipi10 的答案,其中保留了 a 列。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        相关资源
        最近更新 更多