我觉得这是愚蠢的,但这里有。我有一个数字列表,但我想将它与日期结合起来。
例如:
list1 <- c(1, 2, 3, 4, 5)
list2 <-c("2009-01-01")
list3 <-cbind(list2, list1)
我希望SAME日期列出与数据点相同的次数,然后与数据点结合使用。
date number
"2009-01-01" 1
"2009-01-01" 2
"2009-01-01" 3
"2009-01-01" 4
"2009-01-01" 5
当我尝试运行上面的代码时,我收到有关长度不匹配的消息。任何建议表示赞赏。感谢。
答案 0 :(得分:13)
已编辑,使我的数据框评论更具描述性。
如何使用rep
?
list1 <- 1:5
list2 <- rep("2009-01-01",length(list1))
list3 <- cbind(list2, list1)
虽然R的回收规则应该为您提供所需的输出,无论如何。此外,您确定不需要数据框:
list3 <- data.frame(date = list2, number = list1)
因为cbind
会在你的情况下产生一个字符矩阵,因为矩阵必须只有一种类型。
答案 1 :(得分:2)
我发布的原因尽管您认为另一个答案是“完美的”,但cbind
会返回一个矩阵,因为您有一个“字符”向量,完全是“字符”类型。
> str(list3)
chr [1:5, 1:2] "2009-01-01" "2009-01-01" "2009-01-01" ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "list2" "list1
当使用混合类型(日期和数字)的数据来使用data.frame时会更好。它具有额外的功能,您甚至不需要使用rep(),因为参数回收将自动重复:
> data.frame(dt = as.Date("2009-01-01"), l1 = list1)
dt l1
1 2009-01-01 1
2 2009-01-01 2
3 2009-01-01 3
4 2009-01-01 4
5 2009-01-01 5
答案 2 :(得分:1)
cbind
将返回一个数据帧。在这种情况下,它只是充当data.frame
[包括?cbind
]的包装器。
在用户说cbind
确实有效并创建矩阵的其他答案和评论中,他们忽略矩阵是一个字符矩阵,数字合并为字符串。你可能不想那样。
尚未提出的一个解决方案是:
vector1 <- c(1, 2, 3, 4, 5);
vector2 <- c("2009-01-01");
cbind(data.frame(date = vector2), number = vector1);
这会创建一个数据帧,因为第一个参数是数据帧。
但是,我认为最好的,真正表明你知道自己想要的是直接致电data.frame
:
data.frame(date = vector2, number = vector1);