仅选择出现在其他因素的每个级别中的因子级别

时间:2017-09-16 07:11:46

标签: r dplyr data.table filtering data-manipulation

我只想选择Trt的每个级别中显示的Loc级别(通常在每个大型数据集的Loc级别中显示)。

Loc <- rep(paste0("L", 1:2), c(6, 4))
Trt <- c(rep(paste0("T", 1:3), times = 2), rep(paste0("T", 1:2), times = 2))
set.seed(12345)
Y   <- c(rnorm(n=5, mean = 50, sd = 5), NA, rnorm(n=4, mean = 50, sd = 5)) 
df1 <- data.frame(Loc, Trt, Y)
df1

   Loc Trt        Y
1   L1  T1 52.92764
2   L1  T2 53.54733
3   L1  T3 49.45348
4   L1  T1 47.73251
5   L1  T2 53.02944
6   L1  T3       NA
7   L2  T1 40.91022
8   L2  T2 53.15049
9   L2  T1 48.61908
10  L2  T2 48.57920

所需输出

   Loc Trt        Y
   L1  T1 52.92764
   L1  T2 53.54733
   L1  T1 47.73251
   L1  T2 53.02944
   L2  T1 40.91022
   L2  T2 53.15049
   L2  T1 48.61908
   L2  T2 48.57920

这可以使用

来实现
    library(dplyr)
    df1 %>% filter(Trt != "T3")

在这里我知道外表的模式。我正在寻找更一般的解决方案。

3 个答案:

答案 0 :(得分:3)

以下是基础R的另一个想法。我们根据Trt分割Loc并使用Reduce intersect来查找所有常见元素。我们使用这些元素来索引原始数据框,即

i1 <- Reduce(intersect, split(df1$Trt, df1$Loc))
df1[df1$Trt %in% i1,]

给出,

  Loc Trt        Y
1   L1  T1 52.92764
2   L1  T2 53.54733
4   L1  T1 47.73251
5   L1  T2 53.02944
7   L2  T1 40.91022
8   L2  T2 53.15049
9   L2  T1 48.61908
10  L2  T2 48.57920

答案 1 :(得分:2)

您实际上是想弄清楚<input class="AG" id="UnityBtn" type="button" value="Unity" onclick="location.href='../Meeting_Info/Unity.png'" /> 的每个级别中存在哪些df1$Trt - 值。在df1$Loc中可能有一些很好的方法,我不知道。在dplyr基地,您可以这样做:

R

在最后一步中,您还可以坚持使用dirty <- lapply( levels(df1$Loc), function(x) df1$Trt[df1$Loc == x]) clean <- do.call(intersect, dirty) df1[df1$Trt %in% clean, ] # Loc Trt Y # 1 L1 T1 52.92764 # 2 L1 T2 53.54733 # 4 L1 T1 47.73251 # 5 L1 T2 53.02944 # 7 L2 T1 40.91022 # 8 L2 T2 53.15049 # 9 L2 T1 48.61908 # 10 L2 T2 48.57920 解决方案:

dplyr

答案 2 :(得分:2)

使用data.table,可能的解决方案是

library(data.table)
setDT(df1)[df1[, uniqueN(Loc), by = Trt][V1 == df1[, uniqueN(Loc)]], on = "Trt"][, -"V1"]
   Loc Trt        Y
1:  L1  T1 52.92764
2:  L1  T1 47.73251
3:  L2  T1 40.91022
4:  L2  T1 48.61908
5:  L1  T2 53.54733
6:  L1  T2 53.02944
7:  L2  T2 53.15049
8:  L2  T2 48.57920

解释

Loc的唯一级别总数

df1[, uniqueN(Loc)]
[1] 2

每个LocTrt的唯一级别数为

df1[, uniqueN(Loc), by = Trt]
   Trt V1
1:  T1  2
2:  T2  2
3:  T3  1

包含所有级别Trt的{​​{1}}级别为

Loc
df1[, uniqueN(Loc), by = Trt][V1 == df1[, uniqueN(Loc)]]

现在,这个权利加入 Trt V1 1: T1 2 2: T2 2 并从结果中删除了帮助列:

df1