1

2つの列で発生する頻度をカウントする方法は?サンプルデータ:

> sample <- dput(df)
structure(list(Nom_xp = c("A1FAA", "A1FAJ", "A1FBB", "A1FJA", 
"A1FJR", "A1FRJ"), GB05.x = c(100L, 98L, NA, 100L, 102L, 98L), 
    GB05.1.x = c(100L, 106L, NA, 100L, 102L, 98L), GB18.x = c(175L, 
    173L, 177L, 177L, 173L, 177L), GB18.1.x = c(177L, 175L, 177L, 
    177L, 177L, 177L)), .Names = c("Nom_xp", "GB05.x", "GB05.1.x", 
"GB18.x", "GB18.1.x"), row.names = c(NA, 6L), class = "data.frame")

周波数を数える:

apply(sample[,2:5],2,table)

では、列のプレフィックスごと、または2列ごとにカウントを組み合わせるにはどうすればよいですか?最初の4つの列で期待される出力は、次のとおりです。

$GB05
98 100 102 106
3  4   2   1
$GB18
173 175 177
2   2   8

最初の2列のカウントを取得する1つの方法:

  table(c(apply(sample[,2:3],2,rbind)))
98 100 102 106 
  3   4   2   1

しかし、これをdata.frame全体に適用するにはどうすればよいですか?

4

3 に答える 3

2

データフレーム全体に適用する場合はtable、次を使用できます。

table(unlist(sample[,-1]))

これは:

 98 100 102 106 173 175 177 
  3   4   2   1   2   2   8 

列名のプレフィックス(たとえば、最初の4文字目)でグループ化する場合は、次のように実行できます。

cols <- names(sample)[-1]
groups <- unique(substr(cols,0,4))
sapply(groups, function(name) table(unlist(sample[,grepl(paste0("^",name),names(sample))])))

これは:

$GB05

 98 100 102 106 
  3   4   2   1 

$GB18

173 175 177 
  2   2   8 
于 2013-02-06T21:34:45.433 に答える
1

これは、アンソニーの答えとジュバの答えのハイブリッドのような別の答えです。

最初のステップは、data.frameを「長い」に変換することdata.frameです。私は通常、できる限り使用しますが、私のオブジェクトと同様の出力を取得stackすることもできます。library(reshape2); df2 <- melt(df)df2

df2 <- data.frame(df[1], stack(df[-1]))
head(df2)
#   Nom_xp values    ind
# 1  A1FAA    100 GB05.x
# 2  A1FAJ     98 GB05.x
# 3  A1FBB     NA GB05.x
# 4  A1FJA    100 GB05.x
# 5  A1FJR    102 GB05.x
# 6  A1FRJ     98 GB05.x

次に、の一意の値を知る必要がありますind。jubaはそれをで行いsubstrましたが、ここでgsubは正規表現を使用して行いました。これを追加する必要はありませんdata.frame。他の関数で直接呼び出すことができます。すぐに頭に浮かぶ2つの関数はとです。どちらも探している出力を提供しますbytapply

by(df2$values, 
   list(ind = gsub("([A-Z0-9]+)\\..*", "\\1", df2$ind)), 
   FUN=table)
# ind: GB05
# 
#  98 100 102 106 
#   3   4   2   1 
# ------------------------------------------------------------------------------ 
# ind: GB18
# 
# 173 175 177 
#   2   2   8 

tapply(df2$values, gsub("([A-Z0-9]+)\\..*", "\\1", df2$ind), FUN = table)
# $GB05
# 
#  98 100 102 106 
#   3   4   2   1 
# 
# $GB18
# 
# 173 175 177 
#   2   2   8 
于 2013-02-07T10:11:26.590 に答える
1

ジュバの答えは正しかったと思いますが、何か他のものを探しているとしたら、おそらくこれでしょうか?

library(reshape2)

x <- melt( sample[ , 2:5 ] )

table( x[ , c( 'variable' , 'value' ) ] ) 

これは

          value
variable   98 100 102 106 173 175 177
  GB05.x    2   2   1   0   0   0   0
  GB05.1.x  1   2   1   1   0   0   0
  GB18.x    0   0   0   0   2   1   3
  GB18.1.x  0   0   0   0   0   1   5

希望する出力構造の例を提供してください:)

于 2013-02-06T21:46:23.393 に答える