改变 rowSums 排除一列
mutate rowSums exclude one column
我有这样一个数据框
> 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
正确的方法是什么?
这应该有效:
#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
。
如果你想在结果中保留非数字列,你可以这样做:
dat %>% mutate(total=rowSums(.[, sapply(., is.numeric)]))
更新: 现在 dplyr
有 scoped versions 个标准动词,这是另一个选项:
dat %>% mutate(total=rowSums(select_if(., is.numeric)))
更新 2: 对于 dplyr 1.0
,上述方法仍然有效,但您也可以通过组合 rowwise
和 [=16 来进行行求和=]:
iris %>%
rowwise %>%
mutate(row.sum = sum(c_across(where(is.numeric))))
您可以在 rowSums()
的调用中使用带有 select()
的丰富选择器
df %>% transmute(a, total = rowSums(select(., -a)))
我有这样一个数据框
> 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
正确的方法是什么?
这应该有效:
#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
。
如果你想在结果中保留非数字列,你可以这样做:
dat %>% mutate(total=rowSums(.[, sapply(., is.numeric)]))
更新: 现在 dplyr
有 scoped versions 个标准动词,这是另一个选项:
dat %>% mutate(total=rowSums(select_if(., is.numeric)))
更新 2: 对于 dplyr 1.0
,上述方法仍然有效,但您也可以通过组合 rowwise
和 [=16 来进行行求和=]:
iris %>%
rowwise %>%
mutate(row.sum = sum(c_across(where(is.numeric))))
您可以在 rowSums()
select()
的丰富选择器
df %>% transmute(a, total = rowSums(select(., -a)))