我试图在dataset中创建一个新列,根据来自预先存在的列的输入,为每一行提供一个输出。
在此输出列中,如果给定行中的任何输入值为"0“,则需要"NA”。否则,(如果没有一个输入为0),我希望该行的输出是输入的唯一值的数目。
我认为该解决方案将使用嵌套在应用函数中的函数,但我得到了一个我不理解的错误。
data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
$<-.data.frame
中的错误(*tmp*
,"output",value = c(3L,3L,3L,3L):替换有3行,数据有4行)
我不知道为什么替换有3行,因为我认为apply只是对我的4行中的每一行执行相同的函数。
发布于 2015-06-10 16:37:56
您希望检查行中的任何变量是否为0,因此需要在any(x==0)
语句中使用x == 0
而不是x == 0
:
apply(data, 1, function(x) {ifelse(any(x == 0), NA, length(unique(x)))})
# [1] 1 NA 2
基本上,如果第一个参数长度为n,则ifelse
返回长度为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
发布于 2015-06-10 16:12:43
让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)
作为您的输出,而是一个向量,那么您的函数的逻辑就有问题。
https://stackoverflow.com/questions/30769325
复制