Фильтровать строки информационного кадра с равным значением столбца - PullRequest
0 голосов
/ 14 мая 2018

Предположим, у нас есть такой фрейм данных:

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 критериям: то же значение столбца «шесть» и определенный »семь "столбцовНапример, давайте предположим, что мы хотим строки со столбцом «да»:

> 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 голосов
/ 14 мая 2018

Хорошо, наконец-то у меня это получилось.Я оставляю здесь решение для тех, кто хочет знать:

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)

Немного сложно, может быть, но работает.Конечно, в конце вы должны извлечь фрейм данных из списка.Если у кого-то есть идея получше, опубликуйте ее.Если вам интересно, почему я использую список, работа только с информационными фреймами доставила мне некоторые проблемы.

0 голосов
/ 14 мая 2018

Вот идея через d dplyr. Сначала сгруппируйте v1 и добавьте 2 критерия в filter. Группа должна быть больше 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...