Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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
在R中编写一个包含if/else语句和rowSums()的函数,定义如何处理NAs_R_Function_If Statement_Conditional Statements_Na - Fatal编程技术网

在R中编写一个包含if/else语句和rowSums()的函数,定义如何处理NAs

在R中编写一个包含if/else语句和rowSums()的函数,定义如何处理NAs,r,function,if-statement,conditional-statements,na,R,Function,If Statement,Conditional Statements,Na,我一直在寻找答案,尽我所能,但什么都不管用: 我想编写一个函数来在数据帧中跨行添加值。编写函数最简单,因为我有很多列,不必总是添加相同的列。以下是数据帧的示例: ExampleData <- data.frame(Participant = 1:7, Var1 = c(2, NA, 13, 15, 0, 2, NA), Var2 = c(NA, NA, 1, 0, NA, 4, 2),

我一直在寻找答案,尽我所能,但什么都不管用:

我想编写一个函数在数据帧中跨行添加值。编写函数最简单,因为我有很多列,不必总是添加相同的列。以下是数据帧的示例:

ExampleData <- data.frame(Participant = 1:7,
                   Var1 = c(2, NA, 13, 15, 0, 2, NA),
                   Var2 = c(NA, NA, 1, 0, NA, 4, 2),
                   Var3 = c(6, NA, 1, 0, 1, 5, 3),
                   Var4 = c(12, NA, NA, 4, 10, 1, 4),
                   Var5 = c(10, NA, 3, 5, NA, 4, 4))
ExampleData=0,或不是NA),则行和应忽略NA并添加值

到目前为止,我找到的最佳解决方案是:

addition <- function(x) {
  if(all(is.na(x))){
       NA
  }else{
       rowSums(x, na.rm = TRUE)
  }
}
addition(ExampleData[, c("Var1", "Var2", "Var3")])

addition原因是
all(is.na(x))
正在检查数据集的所有元素是否都是na而不是按行。如果我们检查
is.na(data)
的输出,它是一个逻辑
矩阵
。矩阵基本上是带有维度属性的向量。因此,用
all
换行检查是否所有元素都是NA

比如说,

all(is.na(matrix(c(1:9, NA), 5, 2)))
#[1] FALSE
我们可以将函数更改为

 addition <- function(x) {
     rowSums(x, na.rm = TRUE) *  NA^(rowSums(!is.na(x))==0)

 }
addition(ExampleData[, c("Var1", "Var2", "Var3")])
#[1]  8 NA 15 15  1 11  5

添加
all(is.na(x))
是一个问题。它用于整个数据集,而不是在函数中使用
sum
,然后您可以
按行应用该函数
apply(例如data[,c(“Var1”,“Var2”,“Var3”)],1,addition)
在appply之外,您应该使用
rowSums
,因为apply方法非常慢。非常感谢,这非常有效,对我帮助很大。我想了一会儿乘法符号后的这个词,但现在它有了意义。