Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr对列中的NAs求和_R_Dplyr - Fatal编程技术网

使用dplyr对列中的NAs求和

使用dplyr对列中的NAs求和,r,dplyr,R,Dplyr,在244列的数据框架中,我有4列。我需要对这些列进行求和,这可以通过一个简单的求和函数来完成。但是,该总和未考虑nas。所以当我跑步时: df <- d%>% rowwise() %>% mutate(DV = sum(x1, x2, x3, x4, na.rm=TRUE)) df% 行() 变异(DV=sum(x1,x2,x3,x4,na.rm=TRUE)) 我得到0,当所有的值都是NA时,我想当x1[2]、x2[2]、x3[2]和x4[2]中的所有值都为零时得到NA

在244列的数据框架中,我有4列。我需要对这些列进行求和,这可以通过一个简单的求和函数来完成。但是,该总和未考虑nas。所以当我跑步时:

df <- d%>% 
rowwise() %>% 
mutate(DV = sum(x1, x2, x3, x4, na.rm=TRUE))
df%
行()
变异(DV=sum(x1,x2,x3,x4,na.rm=TRUE))
我得到0,当所有的值都是NA时,我想当x1[2]、x2[2]、x3[2]和x4[2]中的所有值都为零时得到NA。我已经为此挠头三个小时了,一点也不高兴。我确实从互联网上创建(收集)了一个功能,但它仍然不起作用:

sum0 <- function(x, ...){if(sum(is.na(x))==4) return(NA_real_) else(sum(x, ..., na.rm=TRUE))} 

df <- d%>% 
rowwise() %>% 
mutate(DV = sum0(x1, x2, x3, x4, na.rm=TRUE))
sum0%
变异(DV=sum0(x1,x2,x3,x4,na.rm=TRUE))
它不工作,因为is.na值没有正确计算值。我真的被困在这里了,任何帮助都将不胜感激

假设数据

 # Create a, b, c, d variables
  a <- c('a1', 'a2', 'a3', 'a4')
  b <- c(10, NA, 30, 40)
  c <- c(2.5, NA, 8, 1)
  d <- c(2.5, NA, 10, 7)
  e <- c(2.5, NA, 10, 7)
  # Join the variables to create a data frame

  df <- data.frame(a, b, c, d, e)
  dfx <- df %>% rowwise() %>% mutate(DV = sum0(c(b,c,d,e)), na.rm = TRUE)
#创建a、b、c、d变量
a你可以做:

df %>%
 mutate(DV = rowSums(select(., b:e)))

   a  b   c    d    e   DV
1 a1 10 2.5  2.5  2.5 17.5
2 a2 NA  NA   NA   NA   NA
3 a3 30 8.0 10.0 10.0 58.0
4 a4 40 1.0  7.0  7.0 55.0
如果可能有只包含几个NAs的行:

df %>%
 mutate(DV = rowSums(select(., b:e), na.rm = TRUE) * NA ^ (rowSums(!is.na(select(., b:e))) == 0))
或者,您也可以执行以下操作:

df %>%
 filter_at(vars(b:e), any_vars(!is.na(.))) %>%
 mutate(DV = rowSums(select(., b:e), na.rm = TRUE)) %>%
 bind_rows(df %>%
            filter_at(vars(b:e), all_vars(is.na(.))))

请提供带有
dput
和预期输出的数据示例。我提供了一个工作示例,请注意,有244列因此不太容易使用select(,-a)命令,如果您通过应用
all(is.NA(x))检查原始数据集的所有列值来替换这些零会怎么样
每列?基于
apply(df,2,函数(x)all(is.na(x)))之类的规则
不幸的是,0是一个可接受的响应,因此无法执行此操作。相关&很好!从不知道您可以在rowSums函数中使用select。我总是使用
行和([2:5])
,但我更喜欢它。@Annet您甚至可以使用所有的选择帮助程序作为
以()开始(
匹配()
等:)