我有一个带有空列的数据框。我想用日期填充该数据框的一行。
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)
任何人都可以解释到底发生了什么,为什么第三个代码块可以工作,但是第二个代码块却不能工作吗?实际上,我什至不确定为什么第一段代码不起作用...
非常感谢您!
答案 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