2

2 つの列に基づいてデータ フレームを分割したいのですが、データ フレームのフラットなリストではなく、データ フレームの 2 次元行列を出力したいと考えています。私は自分が使いたいものを達成することができますが、パッケージ開発での使用by()subset避けるべきだと言われました (Ripley からだと思います) 。subsetディムネームを保持するエレガントな代替手段 (おそらく を使用split) はありますか?

# sample data
df <- data.frame(x=rnorm(20), y=rnorm(20), v1=rep(letters[1:5],each=4), v2=rep(LETTERS[6:9]))

# what I did previously
submat <- by(df, list(df$v1,df$v2), subset)
dim(submat) # 5 x 4
dimnames(submat) # "a" "b" "c" "d" "e" ; "F" "G" "H" "I"
4

1 に答える 1

2

求めるデータフレームのマトリックスを取得するにはtapply、特定のデータフレーム サブセットを返す関数を使用しますが、行名は因子レベルに一致します。

> dfmat <- with(df, tapply(1:NROW(df), list(v1,v2), function(idx) df[idx,] ) )
> dfmat[1,1]  # items that are in a single dataframe accessed via matrix indexing
[[1]]
           x         y v1 v2
1 -0.5604756 -1.067824  a  F

> dfmat
  F      G      H      I     
a List,4 List,4 List,4 List,4
b List,4 List,4 List,4 List,4
c List,4 List,4 List,4 List,4
d List,4 List,4 List,4 List,4
e List,4 List,4 List,4 List,4

エントリとしてリストを持つ行列はprint、オブジェクト タイプとエントリ数 (この場合は列) のみを表示するために編集されます。データフレーム属性が維持されるように、各エントリは 1 つの項目を持つリストですが、宝物を取得するには「ドリルダウン」する必要があることに注意してください: 編集: dfmat の属性を追加しました:

>  attributes(dfmat)
$dim
[1] 5 4

$dimnames
$dimnames[[1]]
[1] "a" "b" "c" "d" "e"

$dimnames[[2]]
[1] "F" "G" "H" "I"    
#------------
> attributes( dfmat[1,1])
NULL
#------------
> attributes( dfmat[1,1][[1]])
$names
[1] "x"  "y"  "v1" "v2"

$row.names
[1] 1

$class
[1] "data.frame"
于 2012-11-29T19:52:48.603 に答える