r - 难以理解充满日期的空列的结构

r - difficult to understand structure of empty columns filled with dates

我有一个包含空列的数据框。我想用日期填充该数据框的一行。

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)

谁能解释一下究竟发生了什么,以及为什么第三个代码块有效而第二个代码块无效?事实上,我什至不确定为什么第一段代码不起作用...

非常感谢!

如评论中所述,需要将列的 class 设置为日期。但将这些值作为命名列表传递也很有帮助。

> 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

这是我建议的方法的更复杂的测试(因为我已经厌倦了等待你 post 更复杂的代码示例):

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>

这让我想起了之前对我 post 编辑的一个有点不同的问题的回答,该回答的灵感来自 Gabor Grothendeick 的评论(我现在将尝试追踪该评论。)找到它;我的最后一个示例展示了如何使用逻辑测试作为 "indexing" 来分配给数据框中的 "blocks" 个项目:R self reference