【问题标题】:ifelse add a calculated field in R dataframeifelse 在 R 数据框中添加计算字段
【发布时间】:2020-04-26 01:00:28
【问题描述】:

大家好,我正在尝试同时使用多个条件将计算字段添加到 R 中的数据框中。

我有以下名为 df 的数据框

     ID A                 AA          AAA        AAAA   AAAAA
1     1 a                 no            57         10     100.0%
2     2 b                 no            32          7      70.0%
3     3 c                yes            30          7      70.0%
4     4 d                 no            52          7      70.0%

我想添加一个名为 Z 的新字段,其条件如下,如果为真,则基本上添加 25%

ifelse(df$AA=="yes",0.25,0) + ifelse(df$AAA<30,0.25,0) + ifelse(df$AAAA>4,0.25,0)

所以我添加了以下代码

df$Z<-as.data.frame(ifelse(df$AA=="yes",0.25,0)+ifelse(df$AAA<30,0.25,0)+ifelse(df$AAAA>4,0.25,0))

但我收到以下错误

Error in `$<-.data.frame`(`*tmp*`, Z, value = list(`ifelse(df$AA=="yes",0.25,0)+ifelse(df$AAA<30,0.25,0)+ifelse(df$AAAA>4,0.25,0)` = numeric(0))) : 
  replacement has 0 rows, data has 200

我想我正在尝试将一个 excel 公式翻译成 R

=IF(C2="yes";25%;0)+IF(D2<30;25%;0)+IF(E2>4;25%;0)

最好的问候

【问题讨论】:

  • 为了让您的问题易于重现,请将您的数据框放入一个可用的对象中,例如:df

标签: r dataframe if-statement


【解决方案1】:

在最后一列中,如果您有 '%' 符号,则在进行比较之前将其删除。

df$AAAAA <- as.numeric(sub('%', '', df$AAAAA))
df$Z <- with(df, ifelse(AA=="yes",0.25,0) + ifelse(AAA<30,0.25,0) +
                 ifelse(AAAA>4,0.25,0))

不用ifelse也可以这样做

df$Z <- with(df, (AA == 'yes') * 0.25 + (AAA < 30) * 0.25 + (AAAA > 4) * 0.25)

【讨论】:

  • 谢谢Ronak,我尝试了代码并添加了计算字段,但是当我调用数据框df时,最后一列的名称应该是AA而不是Z,令人惊讶的是数据框有两列同名。当我调用df$Z,(这意味着该列存在),列出计算值与索引[1,] 与方括号,而不是像经典的数据帧索引
  • @mauron 尝试使用不同的名称。 df$Z1 &lt;- with(df, (AA == 'yes').......rest of the code
  • 您是在使用我在上面放置的相同代码还是添加更多内容?
  • 是的,Ronak,但我想最好再提出一个问题,因为有几行代码并且是另一个主题
  • 当然,那你可以再问它一个问题。如果此答案对您有所帮助,请考虑通过单击投票按钮旁边的复选标记来接受答案,以便将其标记为已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
相关资源
最近更新 更多