r - 仅选择出现在其他因素的每个水平中的那些水平的因素

标签 r dplyr data.table filtering data-manipulation

我想只选择那些出现在 Loc 级别中的 Trt 级别(通常出现在 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")

这里我知道外观的模式。我正在寻找更通用的解决方案。

最佳答案

这是另一个基于 R 的想法。我们根据 Loc 拆分 Trt 并使用 Reduceintersect找到所有共同的元素。我们使用这些元素来索引原始数据框,即

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

关于r - 仅选择出现在其他因素的每个水平中的那些水平的因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46251221/

相关文章:

r - 以最有效的方式获取间隔期间的事件数

R 行表示按组(或唯一 ID)在多列上

r - 如何让 R IML FeatureImp() 函数正常工作?

javascript - 为什么 console.log 不是 Shiny for R 中的函数?

r - 创建一个新列,该列是dplyr中特定列(按其名称选择)的总和

r - 如何将具有不同(和重复)分隔符的字符串分隔成多列?

用向量替换 data.table 的一部分

r - 在barplot ggplot中手动设置每组颜色

r - 如何在R中绘制旋转轴?

r - 跨多列的每行的最小(或最大值)值