如何以逐行方式对值求和,并始终选择除 R 中的第一列之外的所有列

How to sum values in a row wise fashion and always selecting all columns apart from first in R

提问人:TheBoomerang 提问时间:4/26/2023 最后编辑:benson23TheBoomerang 更新时间:4/26/2023 访问量:50

问:

有没有办法在不显式键入列名的情况下选择列数。这更多是为了自动化目的。请考虑以下代码

a <- c("people", "contracts", "design")
b <- as.numeric(c(1,2,3))
c <- as.numeric(c(2,3,4))
d <- as.numeric(c(5,6,7))

df <- data.frame(cbind(a, b, c, d))

df$b <- as.numeric(df$b)
df$c <- as.numeric(df$c)
df$d <- as.numeric(df$d)

library(dplyr)

df %>% 
  rowwise() %>% 
  mutate(total = sum(b, c, d))

在此示例中,我以逐行方式添加了列 b、c 和 d 的值。 在以后的出口中,会有e、f、g等列。

有没有更好的方法来执行此操作,这样我就不必单独键入列,假设从“b”开始的所有列都将始终是数字。只有 A 列是一个字符。

R 数据帧 行向

评论

1赞 Darren Tsai 4/26/2023
不要用于创建数据帧。如果列具有不同的类型,则强制所有列都归入同一类型。data.frame(cbind(a, b, c, d))cbind

答:

1赞 akrun 4/26/2023 #1

我们可以使用并自动检测数字列c_across

library(dplyr)# version >= 1.1.0
df %>%
   rowwise %>% 
   mutate(total = sum(c_across(where(is.numeric)))) %>%
   ungroup

最好使用rowSumssumrowwise

df %>%
   mutate(total = rowSums(pick(where(is.numeric)), na.rm = TRUE))
          a b c d total
1    people 1 2 5     8
2 contracts 2 3 6    11
3    design 3 4 7    14
2赞 benson23 4/26/2023 #2

如果您确定将始终排除第一列,则可以使用单个列。rowSums

df$Total <- rowSums(df[, -1])

          a b c d Total
1    people 1 2 5     8
2 contracts 2 3 6    11
3    design 3 4 7    14