将重复值放入列中

时间:2011-08-23 14:47:36

标签: r

我觉得这是愚蠢的,但这里有。我有一个数字列表,但我想将它与日期结合起来。

例如:

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

当我尝试运行上面的代码时,我收到有关长度不匹配的消息。任何建议表示赞赏。感谢。

3 个答案:

答案 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);