过滤具有相等列值

时间:2018-05-14 08:50:36

标签: r dataframe filter

假设我们有一个这样的数据框:

df <- data.frame(v1=c("aa", "aa", "b", "cc", "cc"), V2=c("yes", "yes", "no", "yes", "no"))

> df
     six  seven
1    aa    yes
2    aa    yes
3     b    no
4    cc    yes
5    cc    no

我想过滤,然后存储在与2个cryteria匹配的新数据帧行中:相同的“6”列值和特定的“7”列值。例如,假设我们想要包含“是”列的行:

> df
         six seven
    1    aa   yes
    2    aa   yes

我该怎么做?我试过了:

df_new <- filter(df, ...)

但我确信如何强加这两个条件。

require(plyr)
ans = ddply(df, .(seven == "yes"), mutate, count = length(unique(six)))

谁给出:

> ans
  seven == "yes" six seven count
1          FALSE   b    no     2
2          FALSE  cc    no     2
3          FALSE  cc    no     2
4           TRUE  aa   yes     1
5           TRUE  aa   yes     1

但这不会过滤数据帧。

编辑:澄清一下,如果我在数据框中有更多列,如下所示:

df <- data.frame(v1=c("aa", "aa", "b", "cc", "cc","aa","aa"), v2=c("yes", "yes", "no", "yes", "no","no","yes"))

> df
  v1  v2
1 aa yes
2 aa yes
3  b  no
4 cc yes
5 cc  no
6 aa  no
7 aa yes

代码必须提供:

df
              six seven
        1    aa   yes
        2    aa   yes
        7    aa   yes

2 个答案:

答案 0 :(得分:1)

好的,终于有了它。我为这些想知道的人留下了解决方案:

types <- unique(df$six)

tmp = list()
require(dplyr)
for (k in 1:length(types)) {
  tmp[[k]] <- df %>% filter(six == types[k] & seven == "yes")
}
ls <- Filter(function(x) nrow(x) > 1, tmp)

有点棘手,也许,但有效。当然,您必须从列表中提取数据帧。如果有人有更好的想法,请发布。如果你想知道我为什么使用列表,只使用数据帧会给我带来一些问题。

答案 1 :(得分:0)

这是d dplyr的想法。第一组按v1分组,并在filter中添加2个条件。该组需要大于2,以推断v1值是相同的,当然v2 == 'yes'是自解释的,

library(tidyverse)

df %>% 
 group_by(v1) %>% 
 filter(n() >= 2 & all(v2 == 'yes'))

给出,

# A tibble: 2 x 2
# Groups:   v1 [1]
  v1    v2   
  <fct> <fct>
1 aa    yes  
2 aa    yes