具有NA值的两列数据帧的总和

时间:2015-07-16 17:59:45

标签: r

我有一个带有一些NA值的数据框。我需要两列的总和。如果值为NA,我需要将其视为零。

a  b c d
1  2 3 4
5 NA 7 8

列e应该是b和c的总和:

e
5
7

我尝试了很多东西,并且没有运气就完成了二十多次搜索。这似乎是一个简单的问题。任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:25)

dat$e <- rowSums(dat[,c("b", "c")], na.rm=TRUE)
dat
#   a  b c d e
# 1 1  2 3 4 5
# 2 5 NA 7 8 7

答案 1 :(得分:5)

dplyr解决方案,取自here

library(dplyr)
dat %>% 
    rowwise() %>% 
    mutate(e = sum(b, c, na.rm = TRUE))

答案 2 :(得分:1)

这是另一种解决方案,连接 dat$e <- ifelse(is.na(dat$b) & is.na(dat$c), dat$e <-0, ifelse(is.na(dat$b), dat$e <- 0 + dat$c, dat$b + dat$c)) # a b c d e #1 1 2 3 4 5 #2 5 NA 7 8 7

with

编辑,这是另一种解决方案,它使用@kasterma在评论中建议的 dat$e <- with(dat, ifelse(is.na(b) & is.na(c ), 0, ifelse(is.na(b), 0 + c, b + c))) ,这很多更具可读性和直接性:

{list: [{a:true},{b:[{b1:true,b2:true}]},{c:false}]}

答案 3 :(得分:0)

如果两列均包含NA,则要保留NA,则可以使用:

数据,示例:

dt <- data.table(x = sample(c(NA, 1, 2, 3), 100, replace = T), y = sample(c(NA, 1, 2, 3), 100, replace = T))

解决方案:

dt[, z := ifelse(is.na(x) & is.na(y), NA_real_, rowSums(.SD, na.rm = T)), .SDcols = c("x", "y")]

(data.table方式)

答案 4 :(得分:0)

希望对您有帮助

在某些情况下,您有几行非数字。这种方法将为你们俩服务。 请注意: c_across()用于dplyr 1.0.0及更高版本

df <- data.frame(
  TEXT = c("text1", "text2"), a = c(1,5), b = c(2, NA), c = c(3,7), d = c(4,8))

df2 <- df %>% 
  rowwise() %>% 
  mutate(e = sum(c_across(a:d), na.rm = TRUE))
# A tibble: 2 x 6
# Rowwise: 
# TEXT        a     b     c     d     e
# <chr>     <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 text1     1     2     3     4    10
# 2 text2     5    NA     7     8    20