假设我们有一个这样的数据框:
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
答案 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