のは、私は数値列と文字列を持つデータフレームを作りたいとしましょう:ループ内のデータフレームにすべての列を同じタイプにすることなく行を追加するにはどうすればよいですか?
df<-data.frame()
for(i in 1:26) {
df<-rbind(df, cbind(x=i, y=toString(i)))
}
str(df)
'data.frame': 26 obs. of 2 variables:
$ x: Factor w/ 26 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, "names")= chr "x" "x" "x" "x" ...
$ y: Factor w/ 26 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, "names")= chr "y" "y" "y" "y" ...
おっと、私は要因をしたくありませんでした。
df2<-data.frame()
for(i in 1:26) {
df2<-rbind(df2, cbind(x=i, y=toString(i)), stringsAsFactors=FALSE)
}
str(df2)
'data.frame': 26 obs. of 2 variables:
$ x: chr "1" "2" "3" "4" ...
$ y: chr "1" "2" "3" "4" ...
すべてが文字です。
x<-NULL
y<-NULL
for(i in 1:26) {
x<-c(x, i)
y<-c(y, toString(i))
}
df3<-data.frame(x, y, stringsAsFactors=FALSE)
str(df3)
'data.frame': 26 obs. of 2 variables:
$ x: int 1 2 3 4 5 6 7 8 9 10 ...
$ y: chr "1" "2" "3" "4" ...
しかし、あなたが見ることができるように、これは余分なコードが必要です。私はこれを回避するために把握することができます唯一の方法は、最後にデータフレームを別々のベクターを構築し、その後形成することです。 20列のデータフレームがある場合は、ループの前に20個の初期化文が必要で、ループに20個の文が必要です。
これを達成するためのより簡潔な方法はありますか?
タイプ変換を避けるために 'list'として持っている方が良いと思います – akrun
すべてのステップでdfを割り当てる必要がありますか?非常に非効率なようです。なぜ、すべてのステップをlapplyしないで、 'do.call(rbind、list)'? – Shape
**決して**ループ内のdata.frameに行を追加しないでください。これは、実際の問題を説明するのではなく、むしろ非常に悪い解決策を見つけて助けを求めているときに、典型的なXY問題のように思えます。どのように解決しようとしているのかを記述するのではなく、実際に達成しようとしていることを説明することをお勧めします。 –