質問:
データフレームって普通サイズが揃ってるけど、サイズの違うデータフレームって作る方法ある?1つのリストのバラバラな要素として保存するとかはしたくないんだ。なんでかって言うと、これを色んな人にCSVファイルとして送らないといけなくって、それをやるのはデータフレームが一番簡単だと思うから。
x = c(rep("one",2)) y = c(rep("two",10)) z = c(rep("three",5)) cbind(x,y,z)
|
上のコードでは、cbind()
関数は短いcolumnをリサイクルして要素が10個あるようにしてるけど、これを要素が2,5,10個になるようにしたいんだ。
以下の方法も試したけどあんまり効率が良くない。
df = data.frame(one=c(rep("one",2),rep("",8)), two=c(rep("two",10)), three=c(rep("three",5), rep("",5)))
|
回答1:
たぶん君の聞いてるのとは違うと思うけど、こんなのはどう?(別の方法は多分あると思うけど)
まず、ベクトルの長さが異なる場合、データは実際にテーブル状にはなってないよね。
CSVファイルを別のCSVファイルに保存するのはどう?複数のオブジェクトを格納できるasciiフォーマットもいいかも(json、XML)。
もしテーブル状であるのがいいなら、NAで埋めてしまえばいい。
x = 1:5 y = 1:12 max.len = max(length(x), length(y)) x = c(x, rep(NA, max.len - length(x))) y = c(y, rep(NA, max.len - length(y))) x [1] 1 2 3 4 5 NA NA NA NA NA NA NA y [1] 1 2 3 4 5 6 7 8 9 10 11 12
|
長さ位の違う列を持つ data.frame
がいいなら、チェックをしないようにするとか。でもこれは自己責任で。
> x = 1:5 > y = 1:12 > df = list(x=x, y=y) > attributes(df) = list(names = names(df), row.names=1:max(length(x), length(y)), class='data.frame') > df x y 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 <NA> 6 7 <NA> 7 [ reached getOption("max.print") -- omitted 5 rows ]] Warning message: In format.data.frame(x, digits = digits, na.encode = FALSE) : corrupt data frame: columns will be truncated or padded with NAs
|
By
Owen | 回答日時: 2011年8月25日 20:11
回答2:
こんな風に出来るかも
L <- list(x,y,z) cfun <- function(L) { pad.na <- function(x,len) { c(x,rep(NA,len-length(x))) } maxlen <- max(sapply(L,length)) do.call(data.frame,lapply(L,pad.na,len=maxlen)) } (テストはしてない)。
|
回答3:
パディングに対するもう1つのアプローチは:
na.pad <- function(x,len){ x[1:len] } makePaddedDataFrame <- function(l,...){ maxlen <- max(sapply(l,length)) data.frame(lapply(l,na.pad,len=maxlen),...) } x = c(rep("one",2)) y = c(rep("two",10)) z = c(rep("three",5)) makePaddedDataFrame(list(x=x,y=y,z=z))
|
na.pad()
関数は、存在しない要素を参照しようとすると自動的にNAで埋めたベクトルを返すRの機能を利用してる。
makePaddedDataFrame()
は一番長いものを見つけて、残りの部分を一致する長さに埋めるってことをやってる。
By
Peter M | 回答日時: 2011年8月25日 20:19
Source: Create a Data Frame of Unequal Lengths