4

Rには次のデータフレームがあります。

  c1 c2  
1 10  a  
2 20  a  
3 30  b  
4 40  b

次にsplit、次のようにしますz = lapply(split(test$c1, test$c2), function(x) {cut(x,2)}) zその場合:

$a  
[1] (9.99,15] (15,20]  
Levels: (9.99,15] (15,20]

$b  
[1] (30,35] (35,40]
Levels: (30,35] (35,40]  

次に、リストを分割解除して、要素をマージし直したいと思いますunsplit(z, test$c2)。これにより、警告が生成されます。

[1] (9.99,15] (15,20]   <NA>      <NA>     
Levels: (9.99,15] (15,20]
Warning message:
In `[<-.factor`(`*tmp*`, i, value = 1:2) :
  invalid factor level, NAs generated

このエラーが発生しないように、すべてのファクターレベルの和集合を取得してから、分割を解除したいと思います。

z$a = factor(z$a, levels=c(levels(z$a), levels(z$b)))
unsplit(z, test$c2)
[1] (9.99,15] (15,20]   (30,35]   (35,40]  
Levels: (9.99,15] (15,20] (30,35] (35,40]    

私の実際のデータフレームには非常に大きなリストがあるので、すべてのリスト要素(2つだけではない)を反復処理する必要があります。これを行うための最良の方法は何ですか?

4

2 に答える 2

4

unlist() z代わりにできませんか?

> unlist(z)
       a1        a2        b1        b2 
(9.99,15]   (15,20]   (30,35]   (35,40] 
Levels: (9.99,15] (15,20] (30,35] (35,40]

または結果の要素に名前がない場合:

> unlist(z, use.names=FALSE)
[1] (9.99,15] (15,20]   (30,35]   (35,40]  
Levels: (9.99,15] (15,20] (30,35] (35,40]

アドオンパッケージを必要としないシンプルなワンライナーにすべてをマージできます。

> (test2 <- within(test, newvar <- unlist(lapply(split(c1, c2), cut, 2))))
  c1 c2    newvar
1 10  a (9.99,15]
2 20  a   (15,20]
3 30  b   (30,35]
4 40  b   (35,40]
于 2011-04-29T18:50:58.847 に答える
4

私があなたの質問を正しく理解していれば、あなたはこれを必要以上に複雑にしていると思います。これがを使用した1つの解決策plyrです。c2変数でグループ化します。

require(plyr)
ddply(test, "c2", transform, newvar = cut(c1, 2))

これは次を返します:

  c1 c2    newvar
1 10  a (9.99,15]
2 20  a   (15,20]
3 30  b   (30,35]
4 40  b   (35,40]

構造は次のとおりです。

'data.frame':   4 obs. of  3 variables:
 $ c1    : num  10 20 30 40
 $ c2    : Factor w/ 2 levels "a","b": 1 1 2 2
 $ newvar: Factor w/ 4 levels "(9.99,15]","(15,20]",..: 1 2 3 4
于 2011-04-29T18:53:12.643 に答える