如何根据最小样本大小对R中的数据帧进行子集化

时间:2013-08-15 17:14:57

标签: r subset

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

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参数来执行此操作吗?

3 个答案:

答案 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)

您可以使用interactiontable查看每次互动的观察次数(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))),]