【问题标题】:Lapply with ifelse condition在 ifelse 条件下应用
【发布时间】:2018-05-22 11:33:08
【问题描述】:

我有一个包含 40 行和 10 列的数据框。如果行的索引小于 17,我想派生一列,新列称为预测等于“值”列。我的意思是:

ID  Year    Value
1   2016    114235
2   2016    114235
3   2016    114235
4   2016    114235
5   2016    114235

然后:

ID  Year    Value   Prediction
1   2016    114235  114235
2   2016    114235  114235
3   2016    114235  114235
4   2016    114235  114235
5   2016    114235  114235

我尝试编码如下,新列的所有行都是“NA”。

newdata$Prediction <- ifelse(nrow(newdata) <= 17, newdata$Value, NA)

newdata$Prediction <- lapply(newdata, function(x) ifelse(nrow(newdata) <= 17, newdata$Value, NA))

它不起作用。我该怎么做?

【问题讨论】:

  • df$Prediction &lt;- NA; df$Prediction[1:17] &lt;- df$Value[1:17] ?

标签: r if-statement dataframe sapply


【解决方案1】:

你需要 lapply 功能吗?

你可以这样做:

nrow = 20
newdata <- data.frame(ID = 1:nrow,
           Year = rep(2016, nrow),
           Value = rep(114235, nrow))


newdata$Prediction <- newdata$Value
if (nrow(newdata) > 17) {
  newdata[17:nrow(newdata),]$Prediction <- NA
}

newdata

像这样,如果手头的行数少于 17 行,它不会更改数据。否则它将添加新行并用 NA 填充它们。

【讨论】:

  • 如果newdata 的行数少于 17 行会怎样?
【解决方案2】:

我认为您只需更改代码中的一小部分即可获得所需的内容。

newdata$Prediction <- ifelse(newdata$ID <= 17, newdata$Value, NA)

您已经有一个似乎已排序的 ID 列,因此其行为类似于行号。 nrow() 只会为您提供行数,在您的情况下,数据集的行数大于 17,因此您在每一行都获得 NA。

【讨论】:

    【解决方案3】:

    而不是使用

    newdata$Prediction <- ifelse(nrow(newdata) <= 17, newdata$Value, NA)
    

    你可以使用类似的东西

    newdata$Prediction <- ifelse(as.numeric(rownames(newdata)) <= 17, newdata$Value, NA)
    

    这里的区别在于了解nrow()rownames() 的工作原理。

    例如,采用 3 的阈值,您的样本输入返回

      ID Year  Value Prediction
    1  1 2016 114235     114235
    2  2 2016 114235     114235
    3  3 2016 114235     114235
    4  4 2016 114235         NA
    5  5 2016 114235         NA
    

    虽然您问题的 cmets 中提到的方法完全有效,但我仍然发布此内容,因为您的尝试并不太远。


    或者,您也可以尝试使用tidyverse 函数:

    newdata %>%
      mutate(rn = 1:n()) %>%
      mutate(Prediction = if_else(rn <= 3, Value, NULL)) %>%
      select(-rn)
    

    【讨论】:

    • 如果数据集的行数超过 17 行,这将为所有预测行生成 NA。
    • @SeGa 哎呀!感谢您指出了这一点。现在修复它,并添加了一个示例输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多