17

私はこのネストされたデータフレームを持っています

test <- structure(list(id = c(13, 27), seq = structure(list(
`1` = c("1997", "1997", "1997", "2007"),
`2` = c("2007", "2007", "2007", "2007", "2007", "2007", "2007")), 
.Names = c("1", "2"))), .Names = c("penr", 
"seq"), row.names = c("1", "2"), class = "data.frame")

2番目の列のすべての値のリストが必要です。

result <- c("1997", "1997", "1997", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007")

これを達成する簡単な方法はありますか?

4

2 に答える 2

16

この行はトリックを行います:

do.call("c", test[["seq"]])

または同等のもの:

c(test[["seq"]], recursive = TRUE)

あるいは:

unlist(test[["seq"]])

これらの関数の出力は次のとおりです。

    11     12     13     14     21     22     23     24     25     26     27 
"1997" "1997" "1997" "2007" "2007" "2007" "2007" "2007" "2007" "2007" "2007" 

文字ベクトルの上の名前を取り除くにはas.character、結果のオブジェクトを呼び出します。

> as.character((unlist(test[["seq"]])))
 [1] "1997" "1997" "1997" "2007" "2007" "2007" "2007" "2007" "2007" "2007"
[11] "2007"
于 2012-02-27T15:15:34.903 に答える
5

これは答えではありませんが、ポールの答えのフォローアップ/補足です:

一貫して、任意の回数の反復で、cメソッドが最高のパフォーマンスを発揮します。ただし、反復回数を100000に増やすと、リスト解除は最も貧弱なものからcメソッドに非常に近いものになりました。

1000回の反復

     test replications elapsed relative user.self sys.self user.child sys.child
2       c         1000    0.04 1.333333      0.03        0         NA        NA
1 do.call         1000    0.03 1.000000      0.03        0         NA        NA
3  unlist         1000    0.23 7.666667      0.04        0         NA        NA

100,000回の反復

     test replications elapsed relative user.self sys.self user.child sys.child
2       c       100000    8.39 1.000000      3.62        0         NA        NA
1 do.call       100000   10.47 1.247914      4.04        0         NA        NA
3  unlist       100000    9.97 1.188319      3.81        0         NA        NA

ポールを共有してくれてありがとう!

R2.14.1を実行しrbenchmarkているwin7マシンで使用して実行されたベンチマーク

于 2012-02-27T16:05:55.717 に答える