0

列が同じで行の長さが異なる 5 つのデータフレームがあるとします。5つのデータフレームのそれぞれから特定の列を取得し、長さが一致しないNA(または何でも)で埋める1つのデータフレームを作成したいと思います。ここで、1回限りのベクトルでこれを行う方法を示す質問を見てきましたが、より大きなデータセットでそれを行う方法を探しています.

例: 同じ長さの 2 つのデータフレーム:

long <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
long2 <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))

それらを組み合わせたリストを作成してから、空のデータフレームを作成し、リスト内のデータフレームから共通の変数を入力できます。

list1 <- list(long, long2)
df1 <- as.data.frame(matrix(0, ncol = 5, nrow = 350))
df1[,1:2] <- sapply(list, '[[', 'accepted')

そして、それは機能します。

しかし、長さが異なるデータフレームがさらにある場合、このアプローチは失敗します。

long <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
long2 <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
medlong <- data.frame(accepted = rnorm(300, 2000), cost = rnorm(300,5000))
medshort <- data.frame(accepted = rnorm(150, 2000), cost = rnorm(150,5000))
short <- data.frame(accepted = rnorm(50, 2000), cost = rnorm(50,5000))

リストと結合されたデータフレームを作成します。

list2 <- list(long, long2, medlong, medshort, short)
df2 <- as.data.frame(matrix(0, ncol = 5, nrow = 350))
df1[,1:5] <- sapply(list, '[[', 'accepted')

サイズの不一致に関するエラーが表示されます。

エラー[<-.data.frame( *tmp*、 、1:5、値 = c(1998.77096640377、: 交換には 700 個のアイテムがあり、1750 が必要です)

このデータフレームに他のデータフレームとは異なる長さの列を設定するために私が見つけた唯一の解決策は、次のようなものです。

combined.df <- as.data.frame(matrix(0, ncol = 5, nrow = 350))
combined.df[,1] <- long[,2]
combined.df[,2] <- c(medlong[,2], rep(NA, nrow(long) - nrow(medlong))

しかし、それを行うためのよりエレガントで高速な方法が必要です...ここでは概念的に大きな何かが欠けていることを知っています

4

3 に答える 3

2

1 つの方法は、最も長い列の長さを見つけてから、短い列を適切な数の NA で連結することです。1つの方法は次のようになります(MWEのより妥当なサイズのデータ​​を使用して!)...

out <- lapply(  list1 , '[[', 'accepted')

#  Find length of longest column
len <- max( sapply( out , length ) )

# Stack shorter columns with NA at the end
dfs <- sapply( out , function(x) c( x , rep( NA , len - length(x) ) ) ) 

#  Make data.frame and set column names at same time
setNames( do.call( data.frame , dfs ) , paste0("V" , 1:length(out) ) )
          V1         V2          V3
1 -1.0913212 -2.4864497  0.04220331
2 -0.5252874  0.8030984  0.21774515
3  0.6914167  0.9685629  1.47159957
4         NA         NA -0.89809670
5         NA         NA  0.51140539
6         NA         NA -0.46833136
7         NA         NA -0.40085707
于 2013-10-21T12:43:24.793 に答える