重复向量以填充数据框

时间:2016-07-19 15:22:59

标签: r vector dataframe repeat

似乎这个非常简单的操作习惯为我工作,现在它根本就没有。问题的虚拟版本:

df <- data.frame(x = 1:5) # create simple dataframe
df
  x
1 1
2 2
3 3
4 4
5 5

df$y <- c(1:5) # adding a new column with a vector of the exact same length. Works out like it should
df
 x y
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5

df$z <- c(1:4) # trying to add a new colum, this time with a vector with less elements than there are rows in the dataframe.

Error in `$<-.data.frame`(`*tmp*`, "z", value = 1:4) : 
  replacement has 4 rows, data has 5

我希望这可以使用以下结果:

 x y z
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 1

即。较短的矢量应该自动开始重复。我很确定这曾经适合我(这是一个脚本,我之前已经运行了数百次没有问题)。现在我甚至无法让上面的虚拟示例像我想的那样工作。我错过了什么?

2 个答案:

答案 0 :(得分:4)

如果向量可以均匀回收到data.frame中,则不会出现错误或警告:

df <- data.frame(x = 1:10)
df$z <- 1:5

这可能是您之前遇到的情况。

您可以使用rep_len

提及您的向量
df$y <- rep_len(1:3, length.out=10)

这导致

df
    x z y
1   1 1 1
2   2 2 2
3   3 3 3
4   4 4 1
5   5 5 2
6   6 1 3
7   7 2 1
8   8 3 2
9   9 4 3
10 10 5 1

请注意,您可以使用更常见的rep_len功能代替rep

df$y <- rep(1:3,len=10)

来自rep的帮助文件:

  对于两种常见情况,

rep.intrep_len是更快的简化版本。它们不是通用的。

答案 1 :(得分:1)

如果总行数是新矢量长度的倍数,则可以正常工作。如果不是,它无处不在。特别是,您可能已经将这种类型的回收用于矩阵:

data.frame(1:6, 1:3, 1:4) # not a multiply
# Error in data.frame(1:6, 1:3, 1:4) : 
#   arguments imply differing number of rows: 6, 3, 4
data.frame(1:6, 1:3) # a multiple
#   X1.6 X1.3
# 1    1    1
# 2    2    2
# 3    3    3
# 4    4    1
# 5    5    2
# 6    6    3
cbind(1:6, 1:3, 1:4) # works even with not a multiple
#      [,1] [,2] [,3]
# [1,]    1    1    1
# [2,]    2    2    2
# [3,]    3    3    3
# [4,]    4    1    4
# [5,]    5    2    1
# [6,]    6    3    2
# Warning message:
# In cbind(1:6, 1:3, 1:4) :
#   number of rows of result is not a multiple of vector length (arg 3)