使用 ifelse 在 apply 中
Using ifelse Within apply
我正在尝试在我的数据集中创建一个新列,为每一行提供一个输出,具体取决于预先存在的列的输入。
在此输出列中,我希望 "NA" if 给定行中的任何输入值都是“0”。 否则(如果输入的 none 为 0),我希望该行的输出是输入的唯一值的数量。
我认为解决方案会使用嵌套在 apply 函数中的 ifelse 函数,但我收到一个错误,我没有明白了。
data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
Error in $<-.data.frame
(*tmp*
, "output", value = c(3L, 3L, 3L, 3L, :
replacement has 3 rows, data has 4
我不知道为什么替换有 3 行,因为我认为 apply 只是对我的 4 行中的每一行执行相同的功能。
让n = length(x)
。 ifelse
将 return rep(NA, n)
如果 TRUE
否则 rep(length(unique(x)), n)
。因此 apply
将输出一个矩阵。 data$output <- apply(...
尝试将矩阵(您的结果)分配到 data.frame
、data$output
中的列中。这是您出错的原因。
如果您只是将输出分配给一个变量,您的代码将 运行
out <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
如果您不期望 class(matrix)
作为您的输出,而是一个向量,那么您的函数逻辑有问题。
你想检查一行中是否有任何变量为0,所以你需要在ifelse
语句中使用any(x==0)
而不是x == 0
:
apply(data, 1, function(x) {ifelse(any(x == 0), NA, length(unique(x)))})
# [1] 1 NA 2
基本上 ifelse
returns 如果第一个参数的长度为 n,则为长度为 n 的向量。您希望每行有一个值,但要通过 x==0
传递多个值(您传递的值的数量等于数据框中的列数)。
数据:
(data <- data.frame(a=c(1, 2, 3), b=c(1, 0, 1)))
# a b
# 1 1 1
# 2 2 0
# 3 3 1
我正在尝试在我的数据集中创建一个新列,为每一行提供一个输出,具体取决于预先存在的列的输入。
在此输出列中,我希望 "NA" if 给定行中的任何输入值都是“0”。 否则(如果输入的 none 为 0),我希望该行的输出是输入的唯一值的数量。
我认为解决方案会使用嵌套在 apply 函数中的 ifelse 函数,但我收到一个错误,我没有明白了。
data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
Error in
$<-.data.frame
(*tmp*
, "output", value = c(3L, 3L, 3L, 3L, : replacement has 3 rows, data has 4
我不知道为什么替换有 3 行,因为我认为 apply 只是对我的 4 行中的每一行执行相同的功能。
让n = length(x)
。 ifelse
将 return rep(NA, n)
如果 TRUE
否则 rep(length(unique(x)), n)
。因此 apply
将输出一个矩阵。 data$output <- apply(...
尝试将矩阵(您的结果)分配到 data.frame
、data$output
中的列中。这是您出错的原因。
如果您只是将输出分配给一个变量,您的代码将 运行
out <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
如果您不期望 class(matrix)
作为您的输出,而是一个向量,那么您的函数逻辑有问题。
你想检查一行中是否有任何变量为0,所以你需要在ifelse
语句中使用any(x==0)
而不是x == 0
:
apply(data, 1, function(x) {ifelse(any(x == 0), NA, length(unique(x)))})
# [1] 1 NA 2
基本上 ifelse
returns 如果第一个参数的长度为 n,则为长度为 n 的向量。您希望每行有一个值,但要通过 x==0
传递多个值(您传递的值的数量等于数据框中的列数)。
数据:
(data <- data.frame(a=c(1, 2, 3), b=c(1, 0, 1)))
# a b
# 1 1 1
# 2 2 0
# 3 3 1