0

複数のレベルを持つ因子として 1 つの列を設定したデータ フレームがあります。その列に一意の値がない (つまり、レベルが複数の行に存在する) 行を抽出したいと考えています。

したがって、いくつかの単純なテスト データの場合:

factor dat1 dat2 dat3
     a  1.0  1.0  1.0
     a  1.0  0.9  1.0
     b  0.9  0.8  0.6
     c  0.9  1.0  0.0

最初の 2 行だけを保持したいと思います。これを行う最善の方法は何ですか?できれば、より一般的なクエリを作成したいと思います。つまり、少なくとも 3 行、正確に 2 行などに存在する因子のレベルの行を抽出します。

4

3 に答える 3

3

table(データフレームの名前が であると仮定して)の解決策は次のとおりですdf

nRows <- 2 # minimum number of occurrences

tab <- table(df$factor) # count

df[df$factor %in% names(tab)[tab >= nRows], ] # extract rows

代わりに正確な基準を使用する場合は、 に変更>===ます。

結果:

  factor dat1 dat2 dat3
1      a    1  1.0    1
2      a    1  0.9    1
于 2013-01-21T13:37:01.303 に答える
1

ave()このようなタイプの問題では、照合するデータセット内の行数と同じ長さのベクトルを生成するために を使用するのが好きです。アプローチnames()で必要とされるように参照するよりも、少し直接的だと思います。table()

## Your data
mydf <- read.table(header = TRUE, 
          stringsAsFactors = FALSE, 
          text = "factor dat1 dat2 dat3
                  a  1.0  1.0  1.0
                  a  1.0  0.9  1.0
                  b  0.9  0.8  0.6
                  c  0.9  1.0  0.0")

## Your vector to match against
factorlengths <- ave(as.numeric(mydf$factor), 
                     mydf$factor, FUN = length)
factorlengths
# [1] 2 2 1 1

## The subsetting
mydf[factorlengths > 1, ]
#   factor dat1 dat2 dat3
# 1      a    1  1.0    1
# 2      a    1  0.9    1
mydf[factorlengths == 1, ]
#   factor dat1 dat2 dat3
# 3      b  0.9  0.8  0.6
# 4      c  0.9  1.0  0.0

の値mydf$factorが実際に因子である場合は、ave(as.numeric(as.character(mydf$factor...代わりに使用する必要があります。

于 2013-01-21T16:49:03.463 に答える
0

検討のための別のアプローチを次に示します。

mydf <- data.frame(fac = c("a", "a", "b", "c", "d", "d", "e"),
dat1 = rnorm(7), dat2 = rnorm(7), dat3 = rnorm(7))

library("plyr")

cts <- count(mydf, vars = "fac")
keep <- as.character(subset(cts, freq > 1)$fac)
keep2 <- mydf$fac %in% keep
mydf2 <- mydf[keep2,]

変換するもの:

  fac        dat1       dat2       dat3
1   a  0.83565861  0.2293744 -1.2932864
2   a -0.05509087  0.1995655 -1.7961443
3   b -0.82794260  1.6314641 -0.3622872
4   c  0.13907037 -0.4560306 -0.3751849
5   d -0.30057042  0.8347340  0.4798789
6   d -1.15576099 -0.5945094 -0.3124572
7   e  1.17671034  0.1453544 -2.6906382

に:

  fac        dat1       dat2       dat3
1   a  0.83565861  0.2293744 -1.2932864
2   a -0.05509087  0.1995655 -1.7961443
5   d -0.30057042  0.8347340  0.4798789
6   d -1.15576099 -0.5945094 -0.3124572

ワンライナーを使用している可能性があると思いましたがduplicated、この場合に必要なものがまったく返されません。

于 2013-01-21T14:00:08.173 に答える