Как объединить два подмножества дат в один столбец? - PullRequest
0 голосов
/ 21 ноября 2018

У меня одна из этих проблем с датой.

В кадре данных dfr У меня есть два столбца даты из-за слияния, допустима только дата с правильным годом, и я хочу, чтобы она была в дополнительном столбце.

> head(dfr, 4)
   id year some.vars     date17     date18
1 101 2017         8 2017-11-21 2018-11-21
2 101 2018         0 2017-11-21 2018-11-21
3 102 2017         2 2017-11-23 2018-11-23
4 102 2018         9 2017-11-23 2018-11-23

Итаккак обычно, я делаю это

dfr$date <- 0
dfr$date[dfr$year == 2017] <- dfr$date17[dfr$year == 2017]
dfr$date[dfr$year == 2018] <- dfr$date18[dfr$year == 2018]

, но оно дает мне столбец даты в десятичной форме,

> head(dfr, 4)
   id year some.vars     date17     date18       date
1 101 2017         8 2017-11-21 2018-11-21 1511218800
2 101 2018         0 2017-11-21 2018-11-21 1542754800
3 102 2017         2 2017-11-23 2018-11-23 1511391600
4 102 2018         9 2017-11-23 2018-11-23 1542927600

, который мне, вероятно, придется снова отформатировать с помощью as.POSIXct() указав origin или strftime и т. д.но я бы расценил это как обходной путь.(Кроме того, dfr$date <- with(dfr, ifelse(year == 2017, date17, date18)) дает точно такой же.)

Но то, что я хочу , это

> head(dfr, 4)
   id year some.vars     date17     date18       date
1 101 2017         7 2017-11-21 2018-11-21 2017-11-21
2 101 2018         0 2017-11-21 2018-11-21 2018-11-21
3 102 2017         3 2017-11-23 2018-11-23 2017-11-23
4 102 2018         5 2017-11-23 2018-11-23 2018-11-23

Когда я смотрю на подмножества,

d1 <- dfr$date17[dfr$year == 2017]
d2 <- dfr$date18[dfr$year == 2018]
> sapply(list(d1, d2), class)
     [,1]      [,2]     
[1,] "POSIXct" "POSIXct"
[2,] "POSIXt"  "POSIXt"

в этом нет ничего плохого.Поскольку LHS аналогичен, я предполагаю, что происходит проблема с назначением <-.

Я также попытался dfr[which(dfr["year"] == 2017), "date"] <- dfr[which(dfr["year"] == 2017), "date17"], чтобы избежать знака $ (я интерпретировал некоторые пункты в этом ответе вроде так) но такой подход все еще не приводит к успеху.

Так как же в base R можно объединить два подмножества дат в один столбец фрейма данных?

Данные

> dput(dfr)
structure(list(id = c(101L, 101L, 102L, 102L, 103L, 103L, 104L, 
104L, 105L, 105L), year = c(2017L, 2018L, 2017L, 2018L, 2017L, 
2018L, 2017L, 2018L, 2017L, 2018L), some.vars = c(8L, 0L, 2L, 
9L, 6L, 3L, 4L, 0L, 9L, 4L), date17 = structure(c(1511218800, 
1511218800, 1511391600, 1511391600, 1511650800, 1511650800, 1511910000, 
1511910000, 1512169200, 1512169200), class = c("POSIXct", "POSIXt"
), tzone = ""), date18 = structure(c(1542754800, 1542754800, 
1542927600, 1542927600, 1543186800, 1543186800, 1543446000, 1543446000, 
1543705200, 1543705200), class = c("POSIXct", "POSIXt"), tzone = "")), class = "data.frame", row.names = c(NA, 
-10L))

> str(dfr)
'data.frame':   10 obs. of  5 variables:
 $ id       : int  101 101 102 102 103 103 104 104 105 105
 $ year     : int  2017 2018 2017 2018 2017 2018 2017 2018 2017 2018
 $ some.vars: int  1 2 8 6 2 0 1 2 4 1
 $ date17   : POSIXct, format: "2017-11-21" "2017-11-21" "2017-11-23" "2017-11-23" ...
 $ date18   : POSIXct, format: "2018-11-21" "2018-11-21" "2018-11-23" "2018-11-23" ...

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Когда вы создаете столбец даты, вы создаете числовой столбец:

dfr$date <- 0

Затем, когда вы назначаете последующие данные даты, они преобразуются в числовой формат.

Вместо этого создайтестолбец даты из одного или других существующих столбцов даты, затем он имеет тот же тип с самого начала.

0 голосов
/ 21 ноября 2018

Два быстрых решения, оба с точки зрения того, как создать столбец date.

Один:

dfr$date <- 0
class(dfr$date) <- "Date"
dfr$date[dfr$year == 2017] <- dfr$date17[dfr$year == 2017]
dfr$date[dfr$year == 2018] <- dfr$date18[dfr$year == 2018]

Второй:

dfr$date <- dfr$date17
dfr$date[dfr$year == 2018] <- dfr$date18[dfr$year == 2018]

Итак, как показывают оба решения, проблема заключалась в классе нового столбца.

Наконец, когда речь идет о случае аналогичного размера, можно использовать порядок столбцов, как в

dfr$date <- dfr[cbind(1:nrow(dfr), dfr$year - 2013)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...