【问题标题】:Using ifelse Within apply在应用范围内使用 ifelse
【发布时间】:2015-08-26 11:19:25
【问题描述】:

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

在此输出列中,我希望“NA”如果给定行中的任何输入值为“0”。 否则(如果没有任何输入为 0),我希望该行的输出是输入的唯一值的数量。

我认为解决方案会使用嵌套在 apply 函数中的 ifelse 函数,但我收到了一个我不理解的错误。

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

$&lt;-.data.frame(*tmp*, "输出", value = c(3L, 3L, 3L, 3L, 中的错误: 替换有 3 行,数据有 4

我不知道为什么替换有 3 行,因为我认为 apply 只是对我的 4 行中的每一行执行相同的功能。

【问题讨论】:

    标签: r if-statement nested dataframe apply


    【解决方案1】:

    您要检查一行中的任何变量是否为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 返回一个长度为 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
    

    【讨论】:

      【解决方案2】:

      n = length(x)。如果TRUE 否则ifelse 将返回rep(NA, n) 否则rep(length(unique(x)), n)。因此apply 将输出一个矩阵。 data$output &lt;- apply(... 尝试将矩阵(您的结果)分配到您的 data.framedata$output 的列中。这就是你的错误的原因。

      如果您只是将输出分配给变量,您的代码将运行

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

      如果您不希望 class(matrix) 作为您的输出,而是一个向量,那么您的函数逻辑有问题。

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-30
        • 2019-10-23
        相关资源
        最近更新 更多