使用ifelse在申请范围内

时间:2015-06-10 23:56:37

标签: r if-statement nested dataframe apply

我正在尝试在我的数据集中创建一个新列,为每一行提供一个输出,具体取决于预先存在的列的输入。

在此输出列中,如果给定行中的任何输入值为“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行中的每一行执行相同的功能。

2 个答案:

答案 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.framedata$output的列中。这是导致错误的原因。

如果您只是将输出分配给变量

,则代码将会运行

out <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})

如果你不期望class(matrix)作为你的输出,而是一个向量,那么你的函数逻辑就会出现问题。