假设您有一个数据框架,其中包含两个级别的因子,如下所示:
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
等等
我如何根据因子1和因子2(Fact1 * Fact2)的组合具有两个以上观察值的条件来
subset
此数据帧(如果可以,请输入“ df”)?您可以使用length
中的subset
参数执行此操作吗? 最佳答案
假设您的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))),]