3

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

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根据 Factor1 和 Factor2 (Fact1*Fact2) 的组合具有超过 2 个观察值的条件来创建这个数据框(“df”,如果你愿意的话)?你可以使用length参数subset来做到这一点吗?

4

3 回答 3

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
于 2013-08-15T17:32:02.147 回答
3

您可以使用interactionandtable查看每次交互的观察次数(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)), ]
于 2013-08-15T17:19:56.373 回答
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不适用于 class 的对象factor,在这种情况下,您需要执行以下操作:

mydf[with(mydf, as.logical(ave(as.character(Factor1), Factor1, Factor2, 
                               FUN = function(x) length(x) > 2))),]
于 2013-08-15T17:27:49.477 回答