2

7 列のデータ フレームがあり、一部の行には 7 つの値があり、他の行には特定のポイントを過ぎた NA があるとします。NA ではない最後の値 (左から右に移動) を取得し、次に値を直接左に取得したいと考えています。これは階層的なデータですが、一部のグループは他のグループよりも深くなります。新しいデータ フレームの 2 つの列に、最も深いグループと 2 番目に深いグループが必要です。

このコードは機能しますが、46K 観測のデータ フレームのメモリを使い果たします。私が考えていないより効率的な方法はありますか?

df <- data.frame(LEVEL1 = c('animal', 'vegetable', 'mineral'),
                 LEVEL2 = c('mammal', 'pepper', 'rock'),
                 LEVEL3 = c('dog', 'jalepeno', NA),
                 LEVEL4 = c('westie', NA, NA))

deepest <- apply(df, 1, 
                  function(x) length(which(!is.na(x))))
one.up <- apply(df, 1, 
                    function(x) length(which(!is.na(x)))-1)
len <- nrow(df)
output <- data.frame(one.up = unlist(sapply(1:len, 
                            function(x) df[x, one.up[x]])),
                     deepest= unlist(sapply(1:len, 
                                            function(x) df[x, deepest[x]])))

初投稿です。通常、このサイトから必要なものをまとめることができます。前もって感謝します。

4

2 に答える 2

3

apply次のような単純な呼び出しで、そのループを 2 回実行することを節約できると思います。

> apply(df, 1, function(x) {
+     n <- max(which(!is.na(x)))
+     x[(n-1):n]
+ })
     [,1]     [,2]       [,3]     
[1,] "dog"    "pepper"   "mineral"
[2,] "westie" "jalepeno" "rock"   
于 2012-06-04T23:11:13.750 に答える
1

NAが行の長さ全体に散在している場合、コードが期待どおりの結果をもたらすかどうかはわかりません(ただし、これは発生しないはずです)。このコードは最初のNAの前で停止し、2つの前の値を返します。

> output.m <- apply(df,1,function(x) { leng.na <-rle(is.na(x))$lengths[1]
                                       tail(x[1:leng.na],2) }  )
> output.d <- as.data.frame(t(output.m))
> output.d
       V1       V2
1     dog   westie
2  pepper jalepeno
3 mineral     rock
于 2012-06-04T23:15:57.797 に答える