在 R 中编写一个包含 if/else 语句和 rowSums() 的函数,定义如何处理 NA
Write a function in R containing an if/else statement and rowSums(), defining how to handle NAs
我一直在寻找答案并尽我所能,但没有任何效果:
我想写一个函数来在数据框中跨行添加值。编写一个函数是最简单的,因为我有很多列并且不必总是添加相同的列。这里有一个数据框的例子:
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))
条件:如果一行中的所有值都是 NA,则总和应该是 NA。如果一行中至少有一个值是数字(>= 0 或不是 NA),则 rowSums 应忽略 NA 并添加这些值。
到目前为止我找到的最佳解决方案是:
addition <- function(x) {
if(all(is.na(x))){
NA
}else{
rowSums(x, na.rm = TRUE)
}
}
addition(ExampleData[, c("Var1", "Var2", "Var3")])
输出为:[1] 8 0 15 15 1 11 5
但应该是:[1] 8 NA 15 15 1 11 5
有人知道怎么做吗?
谢谢你。
原因是 all(is.na(x))
正在检查数据集的所有元素是否都是 NA 而不是按行。如果我们检查 is.na(data)
的输出,它是一个合乎逻辑的 matrix
。 matrix
基本上是具有维度属性的 vector
。因此,用 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
我一直在寻找答案并尽我所能,但没有任何效果:
我想写一个函数来在数据框中跨行添加值。编写一个函数是最简单的,因为我有很多列并且不必总是添加相同的列。这里有一个数据框的例子:
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))
条件:如果一行中的所有值都是 NA,则总和应该是 NA。如果一行中至少有一个值是数字(>= 0 或不是 NA),则 rowSums 应忽略 NA 并添加这些值。
到目前为止我找到的最佳解决方案是:
addition <- function(x) {
if(all(is.na(x))){
NA
}else{
rowSums(x, na.rm = TRUE)
}
}
addition(ExampleData[, c("Var1", "Var2", "Var3")])
输出为:[1] 8 0 15 15 1 11 5
但应该是:[1] 8 NA 15 15 1 11 5
有人知道怎么做吗? 谢谢你。
原因是 all(is.na(x))
正在检查数据集的所有元素是否都是 NA 而不是按行。如果我们检查 is.na(data)
的输出,它是一个合乎逻辑的 matrix
。 matrix
基本上是具有维度属性的 vector
。因此,用 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