1

データフレームに9880レコードがあり、それぞれ1000の9つのグループに分割しようとしています。最後のグループには880レコードがあり、それに応じて名前を付けます。1〜9グループにはforループを使用しましたが、最後の880レコードには手動で使用しましたが、これを実現するためのより良い方法があると確信しています。

library(sqldf)
for (i in 0:8)
{
assign(paste("test",i,sep="_"),as.data.frame(final_9880[((1000*i)+1):(1000*(i+1)),   (1:53)]))
}
test_9<- num_final_9880[9001:9880,1:53]

また、1つのforループにすべてのパーツを追加することはできません。

#append all parts
all_9880<-rbind(test_0,test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9)

どんな助けでもありがたいです、ありがとう!

4

2 に答える 2

2

forループは必要ありません-使用split

data <- data.frame(a = 1:9880, b = sample(letters, 9880, replace = TRUE))

splitter <- (data$a-1) %/% 1000

.list <- split(data, splitter)

lapply(0:9, function(i){
  assign(paste('test',i,sep='_'), .list[[(i+1)]], envir = .GlobalEnv)
  return(invisible())
})

all_9880<-rbind(test_0,test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9)

identical(all_9880,data)
## [1] TRUE
于 2012-07-23T05:30:44.490 に答える
2

このソリューションの小さなバリエーション

ls <- split(final_9880, rep(0:9, each = 1000, length.out = 9880))  # edited to Roman's suggestion
for(i in 1:10) assign(paste("test",i,sep="_"), ls[[i]])

バインドのコマンドは機能するはずです。

編集

多くのデータフレームがある場合は、解析評価コンボを使用できます。読みやすくするためにパッケージを使用していますgsubfn

library(gsubfn)
nms <- paste("test", 1:10, sep="_", collapse=",")
eval(fn$parse(text='do.call(rbind, list($nms))'))

これはどのように作動しますか?まず、データフレームのコンマ区切りリストを含む文字列を作成します

> paste("test", 1:10, sep="_", collapse=",")
[1] "test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9,test_10"

次に、この文字列を使用してリストを作成します

list(test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9,test_10)

文字列補間を使用して使用parseします。eval

eval(fn$parse(text='list($nms)'))

文字列補間は、fn$プレフィックスのを介して実装されます。その効果は、変数に含まれる文字列parseをインターセプトして置換することです。文字列を解析して評価すると、必要なリストが作成されます。このソリューションでは、はparse-evalコンボに含まれています。$nmsnms"list($mns)"rbind

編集2

特定のパターンですべての変数を収集し、それらをリストに入れて、行でバインドすることができます。

do.call("rbind", sapply(ls(pattern = "test_"), get, simplify = FALSE))

lsパターン「test_」を持つすべての変数を検索します

sapplyそれらすべての変数を取得し、リストに保存します

do.callリストを行ごとにフラット化します。

于 2012-07-23T05:36:32.350 に答える