我的数据框包含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))
它不起作用。我怎么能这样做?
答案 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)