似乎这个非常简单的操作习惯为我工作,现在它根本就没有。问题的虚拟版本:
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
即。较短的矢量应该自动开始重复。我很确定这曾经适合我(这是一个脚本,我之前已经运行了数百次没有问题)。现在我甚至无法让上面的虚拟示例像我想的那样工作。我错过了什么?
答案 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.int
和rep_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)