Корректирующее значение для нескольких лет в df в R - PullRequest
0 голосов
/ 18 апреля 2020

Итак, у меня есть большой набор данных, в котором многие даты имеют неправильный год. Например, в этом случае я хотел бы обновить год 1970 -> 20015, 1971 -> 2016 и т. Д. c для всех файлов, кроме f4.csv, где я хочу 1970 -> 2001.

Что такое лучший способ сделать это? Я думаю, что я мог бы сделать

            x          y
1  1970-06-15  f1.csv
2  1971-06-16  f1.csv
3  1972-06-17  f1.csv
4  1970-06-18  f2.csv
5  2011-06-15  f3.csv
6  2011-06-16  f3.csv
7  2011-06-17  f3.csv
8  2011-06-18  f3.csv
9  1970-02-10  f4.csv

Я думаю, я мог бы начать с чего-то вроде этого и обновить индексы, но есть ли более общий способ?

index <- which(year(df$x) == 1970 & y != "f4.csv")

1 Ответ

1 голос
/ 18 апреля 2020

Мы можем извлечь год от даты, используя format. Используя case_when, мы можем проверять условия на основе значений y и year и назначать значения для нового года. Наконец, используя str_replace, мы можем поменять значения на новый год.

library(dplyr)

df %>%
  mutate(x = as.Date(x), 
         year = format(x, '%Y'), 
         year = case_when(y != "f4.csv" & year == 1970~"2015", 
                          y != "f4.csv" & year == 1971~"2016", 
                          y == "f4.csv" & year == 1970~"2001", 
                          TRUE ~ year),
         new_x = as.Date(stringr::str_replace(x, '....', year)))


#           x      y year      new_x
#1 1970-06-15 f1.csv 2015 2015-06-15
#2 1971-06-16 f1.csv 2016 2016-06-16
#3 1972-06-17 f1.csv 1972 1972-06-17
#4 1970-06-18 f2.csv 2015 2015-06-18
#5 2011-06-15 f3.csv 2011 2011-06-15
#6 2011-06-16 f3.csv 2011 2011-06-16
#7 2011-06-17 f3.csv 2011 2011-06-17
#8 2011-06-18 f3.csv 2011 2011-06-18
#9 1970-02-10 f4.csv 2001 2001-02-10

данные

df <- structure(list(x = structure(c(2L, 4L, 5L, 3L, 6L, 7L, 8L, 9L, 
1L), .Label = c("1970-02-10", "1970-06-15", "1970-06-18", "1971-06-16", 
"1972-06-17", "2011-06-15", "2011-06-16", "2011-06-17", "2011-06-18"
), class = "factor"), y = structure(c(1L, 1L, 1L, 2L, 3L, 3L, 
3L, 3L, 4L), .Label = c("f1.csv", "f2.csv", "f3.csv", "f4.csv"
), class = "factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...