假设您有一个包含两个级别因素的数据框,如下所示:
Factor1 Factor2 Value
A 1 0.75
A 1 0.34
A 2 1.21
A 2 0.75
A 2 0.53
B 1 0.42
B 2 0.21
B 2 0.18
B 2 1.42
等
我如何subset
这个数据框(“df”,如果你愿意的话)基于因子1和因子2(事实1 *事实2)的组合具有超过2个观察值的条件?您可以使用length
中的subset
参数来执行此操作吗?
答案 0 :(得分:4)
library(data.table)
dt = data.table(your_df)
dt[, if(.N > 2) .SD, list(Factor1, Factor2)]
# Factor1 Factor2 Value
#1: A 2 1.21
#2: A 2 0.75
#3: A 2 0.53
#4: B 2 0.21
#5: B 2 0.18
#6: B 2 1.42
答案 1 :(得分:3)
您可以使用interaction
和table
查看每次互动的观察次数(mydata是您的数据),然后使用%in%
对数据进行子集化。
mydata$inter<-with(mydata,interaction(Factor1,Factor2))
table(mydata$inter)
A.1 B.1 A.2 B.2
2 1 3 3
mydata[!mydata$inter %in% c("A.1","B.1"), ]
Factor1 Factor2 Value inter
3 A 2 1.21 A.2
4 A 2 0.75 A.2
5 A 2 0.53 A.2
7 B 2 0.21 B.2
8 B 2 0.18 B.2
9 B 2 1.42 B.2
根据@Ananda的评论更新:创建交互变量后,您可以使用以下一行代码。
mydata[mydata$inter %in% names(which(table(mydata$inter) > 2)), ]
答案 2 :(得分:3)
假设您的data.frame
被称为mydf
,您可以使用ave
创建逻辑向量来帮助子集:
mydf[with(mydf, as.logical(ave(Factor1, Factor1, Factor2,
FUN = function(x) length(x) > 2))), ]
# Factor1 Factor2 Value
# 3 A 2 1.21
# 4 A 2 0.75
# 5 A 2 0.53
# 7 B 2 0.21
# 8 B 2 0.18
# 9 B 2 1.42
这是ave
计算你的组合。请注意,ave
返回的对象长度与data.frame
中的行数相同(这样便于子集化)。
> with(mydf, ave(Factor1, Factor1, Factor2, FUN = length))
[1] "2" "2" "3" "3" "3" "1" "3" "3" "3"
下一步是将该长度与您的阈值进行比较。为此,我们需要一个用于FUN
参数的匿名函数。
> with(mydf, ave(Factor1, Factor1, Factor2, FUN = function(x) length(x) > 2))
[1] "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "TRUE" "TRUE" "TRUE"
差不多......但由于第一项是字符向量,我们的输出也是一个字符向量。我们想要它as.logical
所以我们可以直接用它来进行子集化。
ave
不适用于类factor
的对象,在这种情况下,您需要执行以下操作:
mydf[with(mydf, as.logical(ave(as.character(Factor1), Factor1, Factor2,
FUN = function(x) length(x) > 2))),]