【问题标题】:Nested Ifelse statement in same table在同一个表中嵌套 Ifelse 语句
【发布时间】:2018-08-24 21:29:39
【问题描述】:

我在下面有一个数据集:

Col1     Col2    Spend
   A        0      100
   A        0      100
   B        0      100
   C        0      100
   D        0      200

我想写一个 ifelse 语句说明,如果 Col2 的和大于 0,则设置 Col2 = Spend。如果 Col2 的总和不大于 0,则仅将 Spend Column 应用于值不等于 A 的相应行,并将其余的保留为 Col2 原始值。

我希望我的最终输出如下所示:

Col1     Col2    Spend
   A        0      100
   A        0      100
   B      100      100
   C      100      100
   D      200      200

我想应该是这样的:

df$Col2 <- ifelse(sum(df$Col2)>0, df$Spend, ifelse(df$Col1!="A", df$Spend, df$Col2))

我的问题是,当我运行它时,我再次检查 Col2 的总和,它仍然没有改变。不知道我在这里做错了什么。

【问题讨论】:

  • 试试这个:if (sum(df$Col2)&gt;0) df$Spend else ifelse(df$Col1!="A", df$Spend, df$Col2)。请注意,“ifelse 返回一个与 test... 形状相同的值”,并且因为 sum(df$Col2)&gt;0 仅返回一个 T 或 F,所以这将返回一个值,然后将其复制以适合您的数据框的列。换句话说,您的 ifelse 返回一个 0 而不是五个。
  • 成功了,谢谢!

标签: r if-statement


【解决方案1】:

数据集

df = read.table(text = "
Col1     Col2    Spend
A        0      100
A        0      100
B        0      100
C        0      100
D        0      200
", header=T)

问题

如果您运行您的代码,您会看到它返回一个0 值,然后复制该值以适合您的列的长度。这不会返回五个0s。

ifelse(sum(df$Col2)>0, df$Spend, ifelse(df$Col1!="A", df$Spend, df$Col2))

# [1] 0

发生这种情况是因为您可以从?ifelse 看到“ifelse 返回一个与 test... 具有相同形状的值”并且您的(测试)sum(df$Col2)&gt;0 将只返回一个值,因为 sum(df$Col2) 是一个值(即总和)。

解决方案

您可以使用带有嵌套ifelseif ... else 语句,如下所示:

if (sum(df$Col2)>0) df$Spend else ifelse(df$Col1!="A", df$Spend, df$Col2)

# [1]   0   0 100 100 200

因此,您检查(您的测试)sum(df$Col2)&gt;0 是否为真,然后返回整个 Spend 列,否则继续执行 ifelse 语句。

【讨论】:

    【解决方案2】:

    这个问题与 R 如何处理向量化操作有关,因为 ifelse 语句的第一个参数返回长度为 1 的逻辑(因为 sum(df$Col2) &gt; 0 只能返回 TrueFalseNA ),只有一个值在其他值中使用。

    这里将是一个正在发生的事情的例子

    > ifelse(TRUE, 1:4, 1:4)
    [1] 1
    > ifelse(c(TRUE, TRUE, FALSE, FALSE), 1:4, 1:4)
    [1] 1 2 3 4
    

    所以你的例子可以通过改变语法来修复

    if (sum(df$Col2)>0) {
        df$Col2 <- df$Spend
    } else {
        df$Col2 <- ifelse(df$Col1!="A", df$Spend, df$Col2)
    }
    

    如果你真的想要单线

    df$Col2 <- ifelse(rep(sum(df$Col2)>0, nrow(df)), df$Spend, ifelse(df$Col1!="A", df$Spend, df$Col2))
    

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2019-05-06
      相关资源
      最近更新 更多