与ifelse条件的交易

时间:2018-05-22 11:33:09

标签: r if-statement dataframe sapply

我的数据框包含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))

它不起作用。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

你需要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填充它们。

答案 1 :(得分:2)

我认为您可以在代码中更改一个小东西以获得所需内容。

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

您已经有一个ID列,它似乎已经排序,因此就像行号一样。 nrow()只会为您提供行数,在您的情况下,数据集的行数大于17,因此您可以在每一行获得NAs。

答案 2 :(得分:1)

而不是使用

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

虽然您的问题评论中提到的方法完全有效,但我仍然发布此信息,因为您的尝试距离太远。

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

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