我正在尝试在我的数据集中创建一个新列,为每一行提供一个输出,具体取决于预先存在的列的输入。
在此输出列中,如果给定行中的任何输入值为“0”,我希望“NA”。 否则(如果没有输入为0),我希望该行的输出为输入的唯一值数。
我认为该解决方案将使用嵌套在 apply 函数中的 ifelse 函数,但是我收到了一个我不理解的错误。
data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
$<-.data.frame
中的错误(*tmp*
,“输出”,值= c(3L,3L,3L,3L,: 替换有3行,数据有4行
我不知道为什么替换有3行,因为我认为apply只对我的4行中的每一行执行相同的功能。
答案 0 :(得分:9)
您想要检查一行中的任何变量是否为0,因此您需要在any(x==0)
语句中使用x == 0
而不是ifelse
:
apply(data, 1, function(x) {ifelse(any(x == 0), NA, length(unique(x)))})
# [1] 1 NA 2
基本上ifelse
如果第一个参数的长度为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
答案 1 :(得分:0)
让select * from s2.servinv;
。如果n = length(x)
ifelse
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)
作为你的输出,而是一个向量,那么你的函数逻辑就会出现问题。