Получить значения из столбца, если два других столбца не соответствуют критериям фильтра - PullRequest
0 голосов
/ 26 мая 2018

Мой фрейм данных выглядит следующим образом:

 Name     Value   Value1  C1   C2    C3
  A        1       2      NA   NA    NA
  A        NA      2      NA   2     NA
  A        1       2      NA   2     NA
  A        1       2      NA   2     NA
  A        1       2      NA   2     NA
  B        NA      1      NA   2     NA
  B        NA      2      NA   2     NA
  B        1       NA     NA   2     NA
  B        1       NA     NA   2     NA
  C        1       5      NA   2     NA
  C        1       5      NA   2     NA

  dt <- as.data.table(df)
  new <- dt[is.na(`Value`) == FALSE & is.na(`Value1`) == FALSE,]

даст мне следующий вывод:

 Name     Value   Value1  C1   C2    C3
  A        1       2      NA   NA    NA
  A        1       2      NA   2     NA
  A        1       2      NA   2     NA
  A        1       2      NA   2     NA
  C        1       5      NA   2     NA
  C        1       5      NA   2     NA

Есть ли способ сделать это, но вместо фильтрации строк, яхочу, чтобы в моем столбце Имя были все буквы, которые не соответствуют критериям моего фильтра.Поэтому в этом примере я хотел бы получить обратно A и B, потому что A имеет одну строку, которая не имеет для обоих столбцов Value и Value1 ненулевые значения, а B вообще не соответствует критериям.

Ответы [ 3 ]

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

Возможно, я вас неправильно понял, но, насколько я мог прочитать описание, я думаю, что вы имели в виду получить все строки определенного Name, в котором есть хотя бы один NA.

Это может бытьзакончено с использованием ave, где мы проверяем, есть ли хотя бы один NA в столбце Value или Value1, а затем выбираем всю эту группу (Name).

df[with(df, ave(is.na(Value) | is.na(Value1), Name, FUN = any)), ]


 #  Name Value Value1 C1 C2 C3
 #1    A     1      2 NA NA NA
 #2    A    NA      2 NA  2 NA
 #3    A     1      2 NA  2 NA
 #4    A     1      2 NA  2 NA
 #5    A     1      2 NA  2 NA
 #6    B    NA      1 NA  2 NA
 #7    B    NA      2 NA  2 NA
 #8    B     1     NA NA  2 NA
 #9    B     1     NA NA  2 NA
0 голосов
/ 26 мая 2018

@ RonakShah уже указал (используя base-R), как filter вывести строки для Name, которые получили не менее 1 NA в Value или Value1 столбцах.

Но, возможно, OP ищет только unique имен вместо полного подмножества строк.В dplyr это можно сделать следующим образом:

library(dplyr)

df %>% group_by(Name) %>%
  filter_at(vars(starts_with("Value")), any_vars(is.na(.))) %>%  #Either Value or Value1 
  select(Name) %>% distinct()

# Name 
# <chr>
# 1 A    
# 2 B 

Чтобы получить полные строки для Name с NA в Value или Value1

df %>% group_by(Name) %>%
  filter(any(is.na(Value) | any(is.na(Value1))))

  #   Name  Value Value1 C1       C2 C3   
  #  <chr> <int>  <int> <lgl> <int> <lgl>
  # 1 A         1      2 NA       NA NA   
  # 2 A        NA      2 NA        2 NA   
  # 3 A         1      2 NA        2 NA   
  # 4 A         1      2 NA        2 NA   
  # 5 A         1      2 NA        2 NA   
  # 6 B        NA      1 NA        2 NA   
  # 7 B        NA      2 NA        2 NA   
  # 8 B         1     NA NA        2 NA   
  # 9 B         1     NA NA        2 NA   

Данные:

df <- read.table(text = 
"Name     Value   Value1  C1   C2    C3
A        1       2      NA   NA    NA
A        NA      2      NA   2     NA
A        1       2      NA   2     NA
A        1       2      NA   2     NA
A        1       2      NA   2     NA
B        NA      1      NA   2     NA
B        NA      2      NA   2     NA
B        1       NA     NA   2     NA
B        1       NA     NA   2     NA
C        1       5      NA   2     NA
C        1       5      NA   2     NA",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 26 мая 2018

Вы можете использовать ! в качестве оператора отрицания.(На самом деле, вы уже должны использовать его вместо == FALSE. Кроме того, вам не нужны обратные пометки, если имена столбцов не странные (в них есть пробелы или что-то в этом роде).

# your code, rewritten with ! instead of == FALSE
df[!is.na(Value) & !is.na(Value1), ]

# negate it to get the opposite
# same as above, but with !( your logic )
df[!(!is.na(Value) & !is.na(Value1)), ]
   Name Value Value1 C1 C2 C3
1:    A    NA      2 NA  2 NA
2:    B    NA      1 NA  2 NA
3:    B    NA      2 NA  2 NA
4:    B     1     NA NA  2 NA
5:    B     1     NA NA  2 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...