假设您有一个数据框架,其中包含两个级别的因子,如下所示:

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))),]

08-25 02:56