我设置了一个数据框,其中一列是一个具有多个级别的因子。我想提取那些没有该列唯一值的行(即该级别存在于多行中)。
所以对于一些简单的测试数据:
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
我只想保留前两行。做这个的最好方式是什么?我想做更多的一般性查询,即提取至少3行,正好2行等因子级别的行。
答案 0 :(得分: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
答案 1 :(得分: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...
。
答案 2 :(得分: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
的单行代码,但在这种情况下并不能完全返回。