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

时间:2019-01-30 22:29:09

标签: r as.date

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

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)

任何人都可以解释到底发生了什么,为什么第三个代码块可以工作,但是第二个代码块却不能工作吗?实际上,我什至不确定为什么第一段代码不起作用...

非常感谢您!

1 个答案:

答案 0 :(得分:1)

如评论中所述,有必要将列的类别设置为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

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

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>

这让我想起了我对我发布的一个稍有不同的问题的较早答案,该问题的灵感来自Gabor Grothendeick的评论(我现在将尝试追踪)。我的最后一个示例显示了如何使用逻辑测试作为对数据框中项目“块”的分配的“索引”:R self reference