关于 dplyr:join 和 sum 列在一起 R

join and sum columns together R

我有一个数据框:

1
2
3
4
df <- data.frame(ca = c("a","b","a","c","b","b"),
                 f = c(3,4,0,NA,3, 4),
                 f2 = c(NA,5,6,1,9, 7),
                 f3 = c(3,0,6,3,0, 8))

我想加入并总结我的列 "f" 和 "f2" 并将其重命名为 "f_news"

示例:

1
2
3
4
df <- data.frame(ca = c("a","b","a","c","b","b"),
                 f_new = c(3,9,6,1,12, 11),
             
                 f3 = c(3,0,6,3,0, 8))

您知道如何使用 summarise、spread、group_by 来完成此操作吗?


使用 plyrdplyr 你可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
df %>%
  rowwise() %>%
  mutate(f_new=sum(f, f2, na.rm = T))

# A tibble: 6 x 5
#   ca     f    f2    f3   f_new
#  <fct> <dbl> <dbl> <dbl> <dbl>
#1   a     3    NA     3     3
#2   b     4     5     0     9
#3   a     0     6     6     6
#4   c    NA     1     3     1
#5   b     3     9     0    12
#6   b     4     7     8    11

此方法将保留和 NA


Dplyr 可以通过以下代码很好地做到这一点。 Rowwise 允许您单独考虑每一行。 mutate 命令对您想要的任何列进行求和。当您有 NA 并想忽略它们时, na.rm=TRUE 会处理此问题。正如评论所提到的,如果你没有这个,如果它在任何总和值中,它会给你一个 NA。

1
2
3
4
library(dplyr)
df %>%
  rowwise() %>%
  mutate(f_new = sum(f,f2, na.rm = TRUE))

这是使用 dplyrtidyr

中的 tidyverse 方法的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
library(tidyverse)

df <- data.frame(ca = c("a","b","a","c","b","b"),
                 f = c(3,4,0,NA,3, 4),
                 f2 = c(NA,5,6,1,9, 7),
                 f3 = c(3,0,6,3,0, 8))

df %>%
  replace_na(list(f = 0, f2 = 0)) %>%
  mutate(f_new = f + f2)
#>   ca f f2 f3 f_new
#> 1  a 3  0  3     3
#> 2  b 4  5  0     9
#> 3  a 0  6  6     6
#> 4  c 0  1  3     1
#> 5  b 3  9  0    12
#> 6  b 4  7  8    11