2016-07-19 7 views
2

私のために働いていたこの非常に単純な操作のように見えますが、今はそれほど簡単ではありません。問題のダミー版:データフレーム内の列を埋めるためにベクトルを繰り返す

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 

すなわち、より短いベクトルは自動的に自動的に繰り返されるはずです。私はこれが私のために働いていたことはかなり確かです(それは前に何百回も問題なく実行していたスクリプトにあります)。今私は私がしたいのと同じように動作する上のダミーの例を得ることができません。私は何が欠けていますか?

答えて

3

ベクトルが均等に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は、2つの一般的な例のためのより高速な単純化されたバージョンです。それらは一般的ではありません。

+0

ありがとうございます。あなたは正しかった。私は前にこのスクリプトを何百回も実行したと言っていたので、何か奇妙なエラーだと思った。私はさまざまなサイズのデータ​​セットでスクリプトを実行していたため、データフレームの行数は一貫してベクトルの長さの倍数になっているとは思われませんでした。しかし、私はそれが判明した。意図的に。そのようになっていたので、私は最終的にエラーの根源がどこか他の場所にあることを発見しました。 –

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) 
関連する問題