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
我有一个包含空列的数据框。我想用日期填充该数据框的一行。
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