Хорошо с условием ifelse - PullRequest
0 голосов
/ 22 мая 2018

У меня есть датафрейм, который содержит 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 голосов
/ 22 мая 2018

Вместо использования

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)
0 голосов
/ 22 мая 2018

Я думаю, что вы можете просто изменить одну небольшую вещь в своем коде, чтобы получить то, что вы хотите.

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

У вас уже есть столбец идентификатора, который выглядит отсортированным и, таким образом, действует как номер строки,nrow () просто выдаст вам количество строк, а в вашем случае количество строк для вашего набора данных будет больше 17, поэтому вы получите NA для каждой строки.

0 голосов
/ 22 мая 2018

Вам нужна функция 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.

...