r - сложная для понимания структура пустых столбцов, заполненных датами - PullRequest
0 голосов
/ 31 января 2019

У меня есть фрейм данных с пустыми столбцами.Я хочу заполнить одну строку этого фрейма данных датами.

x <- data.frame(a = 1:2, b = rep(NA, 2), c = rep(NA, 2))
mydates <- as.Date(c("2016-01-31", "2016-02-29"))
x[1, c("b", "c")] <- mydates
x
str(x)

Мои даты отображаются в первой строке в виде числовых значений, а столбцы b и c теперь являются числовыми.Ясно не то, что я хочу.

Как насчет этого:

x <- data.frame(a = 1:2, b = rep(NA, 2), c = rep(NA, 2))
for (v in c("b", "c")) x[[v]] <- as.Date(x[[v]])
x
str(x)
x[1, c("b", "c")] <- mydates

Хотя я объявил свои переменные как даты, это не работает.

Что работает:

x <- data.frame(a = 1:2, b = rep(NA, 2), c = rep(NA, 2))
x
x[1, c("b", "c")] <- mydates
x
for (v in c("b", "c")) x[[v]] <- as.Date(x[[v]])
x
str(x)

Может кто-нибудь объяснить, что именно происходит и почему работает 3-й блок кода, а второй - нет?На самом деле, я даже не уверен, почему первый блок кода не работает ...

Большое спасибо!

1 Ответ

0 голосов
/ 31 января 2019

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

> x <- data.frame(a = 1:2, b = as.Date(rep(NA, 2)), c = as.Date(rep(NA, 2)))
> x
  a    b    c
1 1 <NA> <NA>
2 2 <NA> <NA>
> x[1, c("b", "c")] <- list( b= as.Date(c("2016-01-31"), c=as.Date("2016-02-29")) )
> x
  a          b          c
1 1 2016-01-31 2016-01-31
2 2       <NA>       <NA>
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ a: int  1 2
 $ b: Date, format: "2016-01-31" NA
 $ c: Date, format: "2016-01-31" NA

Вот более сложный тест метода, который я предлагаю (поскольку я устал ждать, когда вы опубликуете более сложный пример вcode):

x <- data.frame(a = 1:3, b = as.Date(rep(NA, 3)), c = as.Date(rep(NA, 3)))
x
#----------
  a    b    c
1 1 <NA> <NA>
2 2 <NA> <NA>
3 3 <NA> <NA>
#---
x[1:2, c("b", "c")] <- list( b= as.Date(c("2016-01-31", "2020-02-09"), c=as.Date("2016-02-29", "2027-08-22")) )
x
#####
  a          b          c
1 1 2016-01-31 2016-01-31
2 2 2020-02-09 2020-02-09
3 3       <NA>       <NA>

Это напоминает мне о более раннем ответе на несколько иной вопрос, который я разместил, который был вдохновлен комментарием от Габора Гротендейка (который я сейчас попытаюсь отследить.) Нашел его;В последнем из моих примеров показано, как использовать логические тесты в качестве «индексации» для назначений «блокам» элементов в кадре данных: R self reference

...