2

データフレーム内で行ごとに集計したいと思います。次の例では、tablewithinを使用して適切な結果を得ることができます。apply

df.1 <- read.table(text = '
  state  county  city  year1  year2  year3  year4  year5
      1       2     4      0      0      0      1      2
      2       5     3     10     20     10     NA     10
      2       7     1    200    200     NA     NA    200
      3       1     1     NA     NA     NA     NA     NA
', na.strings = "NA", header=TRUE)

tdf <- t(df.1)
apply(tdf[4:nrow(tdf),1:nrow(df.1)], 2, function(x) {table(x, useNA = "ifany")})

結果は次のとおりです。

[[1]]
x
0 1 2 
3 1 1 

[[2]]
x
  10   20 <NA> 
   3    1    1 

[[3]]
x
 200 <NA> 
   3    2 

[[4]]
x
<NA> 
   5 

ただし、次の例では、各行は単一の値で構成されています。

df.2 <- read.table(text = '
  state  county  city  year1  year2  year3  year4  year5
      1       2     4      0      0      0      0      0
      2       5     3      1      1      1      1      1
      2       7     1      2      2      2      2      2
      3       1     1     NA     NA     NA     NA     NA
', na.strings = "NA", header=TRUE)

tdf.2 <- t(df.2)
apply(tdf.2[4:nrow(tdf.2),1:nrow(df.2)], 2, function(x) {table(x, useNA = "ifany")})

私が得る出力は次のとおりです。

# [1] 5 5 5 5

そのため、この出力から、最初の 5 が 0、2 番目の 5 が 1、3 番目の 5 が 2、最後の 5 が NA であることがわかりません。2 番目の例の各 5 で表される値を R に返す方法はありますか?

4

4 に答える 4

6

lapplyリストを体系的に出力するために使用できます。行インデックスをループする必要があります。

sub.df <- as.matrix(df.2[grepl("year", names(df.2))])
lapply(seq_len(nrow(sub.df)), 
       function(i)table(sub.df[i, ], useNA = "ifany"))
于 2013-05-29T23:16:55.667 に答える
4

でラップして結果を保護しlistます。

apply(tdf.2[4:nrow(tdf.2),1:nrow(df.2)], 2, 
              function(x) {list(table(x, useNA = "ifany")) })
于 2013-05-29T23:58:43.770 に答える
3

table解決策は次のとおりです。

table(
    rep(rownames(df.1),5),
    unlist(df.1[,4:8]),
    useNA="ifany")

これは与える

    0 1 2 10 20 200 <NA>
  1 3 1 1  0  0   0    0
  2 0 0 0  3  1   0    1
  3 0 0 0  0  0   3    2
  4 0 0 0  0  0   0    5

...そしてあなたのためにdf.2

    0 1 2 <NA>
  1 5 0 0    0
  2 0 5 0    0
  3 0 0 5    0
  4 0 0 0    5

なんらかの理由でテーブルのリストが本当に好きでない限り、これは解決策です。

于 2013-05-30T00:11:19.627 に答える
2

問題はヘルプに記載されていると思いapplyます:

... n が 1 の場合、MARGIN の長さが 1 の場合、apply はベクトルを返し、それ以外の場合は次元 dim(X)[MARGIN] の配列を返します ...

plyrベース R の apply ファミリの戻り値の不一致が、 s **ply 関数に完全に移行した理由です。したがって、これは必要に応じて機能します。

library(plyr)
alply( df.2[ 4:8 ], 1, function(x) table( unlist(x), useNA = "ifany" ) )
于 2013-05-29T23:33:16.487 に答える