Сохранять только уровни, которые являются неполными, на основе двух столбцов - PullRequest
0 голосов
/ 15 ноября 2018

Я мог бы действительно использовать некоторую помощь со следующим:

I некоторые примеры данных:

Group<-c("A","A","B","B","C","C","D", "D")
Value1<-c("7","1",8,7,"NA",9,10,12)
Value2<-c("NA","NA","NA",7,3,9,7,4)
df<-data.frame(Group, Value1, Value2)

  Group Value1 Value2
     A      7     NA
     A      1     NA
     B      8     NA
     B      7      7
     C     NA      3
     C      9      9
     D     10      7
     D     12      4

Я хочу удалить все группы, которые либо полностью заполнены для Value1 и Value2 (например,Группа D) или не имеют данных для Value2 внутри группы (например, Группа A).Таким образом, я получаю группы, которые заполнены как для Value1, так и для Value2, но являются неполными, например:

  Group Value1 Value2
     B      8     NA
     B      7      7
     C     NA      3
     C      9      9

Я знаю, как удалять NA, и я пробовал кое-что с

setDT()[,  := if(any(Value2==)) "" else "" , by = .()]

но я не знаю, как его использовать в этом случае ..

Кто-нибудь знает, как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Используя данные из @ arg0naut (чтобы оставить NA как NA, а не "NA"), решение для базового R с использованием двух ave будет

df[!with(df, ave(complete.cases(df), Group, FUN = all) | 
             ave(is.na(Value2), Group, FUN = all)), ]

#  Group Value1 Value2
#3     B      8     NA
#4     B      7      7
#5     C     NA      3
#6     C      9      9

Мы держим два условия отдельно и находим строки, которые не хотим выделять, а затем принимаем их отрицание.

0 голосов
/ 15 ноября 2018

Что-то вроде:

setDT(df)[, .SD[!all(is.na(Value2)) & (anyNA(Value1) | anyNA(Value2))], Group]

Выход:

   Group Value1 Value2
1:     B      8     NA
2:     B      7      7
3:     C   <NA>      3
4:     C      9      9

Обратите внимание, что для того, чтобы это работало, ваши значения должны быть действительно NA, а не просто "NA" в виде строк, т. Е. Он работает с примером измененного фрейма данных:

Group<-c("A","A","B","B","C","C","D", "D")
Value1<-c("7","1",8,7,NA,9,10,12)
Value2<-c(NA,NA,NA,7,3,9,7,4)
df<-data.frame(Group, Value1, Value2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...