【问题标题】:Filtering a dataframe based on a sequence of variables根据一系列变量过滤数据框
【发布时间】:2017-09-28 13:22:43
【问题描述】:

我有一个包含变量序列的数据框c1...c20。这些变量中的每一个都包含一个代码。我有一个代码向量code.vec,我想对数据框进行子集化以包含c1|c2|c3|...|c20code.vec 中的记录。

示例数据(示例仅使用 3 个cn 变量):

code.vec<-c("T1", "T2", "T3", "T4")

c1<-c("T1", "X1", "T6", "R5")
c2<-c("R4", "C6", "C7", "X3")
c3<-c("C5", "C2", "X4", "T2")

df<-data.frame(c1, c2, c3)

这就是我目前正在做的事情:

library(dplyr)
df %>% filter(c1 %in% code.vec | c2 %in% code.vec | c3 %in% code.vec)

  c1 c2 c3
1 T1 R4 C5
2 R5 X3 T2

这行得通,但由于真正的数据框有 20 个cn 变量,因此需要大量输入。似乎应该有一个简单的应用或循环解决方案(并且在 SAS 中使用数组和 do 循环很容易做到),但我无法在 R 中找到解决方案,我也找不到任何类似的问题在这里。

【问题讨论】:

    标签: r loops dplyr apply


    【解决方案1】:

    这是一个使用来自dplyrfilter_all 的简单解决方案:

    library(dplyr)
    
    df %>% 
      filter_all(any_vars(. %in% code.vec))
    

    结果:

      c1 c2 c3
    1 T1 R4 C5
    2 R5 X3 T2
    

    在 cmets 中提到,如果您想要过滤 所有 变量包含 code.vec 的行,您可以使用将 any_vars 替换为 all_vars

    df %>% 
      filter_all(all_vars(. %in% code.vec))
    

    【讨论】:

    • 这非常有效。它认为在 tidyverse 中的某个地方有一个解决方案,它比我尝试做的要简单得多。
    • @patward5656 tidyverse 确实很强大。附带说明一下,如果您想过滤 all 变量包含 code.vec 的行,则可以改为使用 df %&gt;% filter_all(all_vars(. %in% code.vec))
    • 这是有史以来最不受欢迎的回复之一。它有一个单独的赞成票,来自我,而且很棒。
    • @Dirk 谢谢,这个答案实际上帮助我获得了我的第一个金徽章:)
    【解决方案2】:

    这是一种应该比较快的方法。

    # get the position of the rows that match using modulus (final row returns 0)
    temp <- which(unlist(dat) %in% code.vec) %% nrow(dat)
    # replace 0s with final row
    temp[temp == 0] <- nrow(dat)
    

    然后子集

    dat[unique(sort(temp)),]
      c1 c2 c3
    1 T1 R4 C5
    4 R5 X3 T2
    

    请注意,我正在处理您的 data.frame 变量中的字符向量。如果您将它们存储为因子,则需要将 unlist(dat) 包装在 as.character() 中。

    数据

    dat <-
    structure(list(c1 = c("T1", "X1", "T6", "R5"), c2 = c("R4", "C6", 
    "C7", "X3"), c3 = c("C5", "C2", "X4", "T2")), .Names = c("c1", 
    "c2", "c3"), row.names = c(NA, -4L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2020-07-01
      • 2023-03-12
      相关资源
      最近更新 更多