删除具有特定NA编号的组

时间:2018-07-22 16:14:46

标签: r filter grouping na

很抱歉打扰一个相对简单的问题。 我有这种类型的数据框:

“ NAME”列c(a,b,c,d,e ...)中的一长串名称,“ SURNAME”列c(A,B)中的两个潜在类,第三列包含价值观。 我要删除所有至少在一个SURNAME类中在VALUE列中具有超过2个“ NA”的名称。 我想发布一个示例数据集,但我正在努力对其进行正确格式化

我正在尝试使用

  df <- df %>% 
  group_by(NAME) %>% 
  group_by(SURNAME) %>% 
  filter(!is.na(VALUE)) %>% 
  filter(length(VALUE)>=3)

它不会引发错误,但是我有错误的印象。有什么建议吗?非常感谢

2 个答案:

答案 0 :(得分:1)

按“ NAME”,“ SURNAME”分组后,创建一个列,该列中该组中有NA个元素,然后在filter个“ NAME”中{ ind'大于或等于3

any

或者根据条件通过“ NAME”,“ SURNAME”进行df %>% group_by(NAME, SURNAME) %>% mutate(ind = sum(is.na(VALUE))) %>% group_by(NAME) %>% filter(!any(ind >=3)) %>% select(-ind) 操作后进行anti_join

filter

数据

df %>% 
   group_by(NAME, SURNAME) %>% 
   filter(sum(is.na(VALUE))>=3) %>% 
   ungroup %>% 
   distinct(NAME)  %>%
   anti_join(df, .)

答案 1 :(得分:0)

让我们创建一个数据集以供使用:

set.seed(1234)
df <- data.frame(
    name     = sample(x=letters,       size=1e3, replace=TRUE),
    surname  = sample(x=c("A", "B"),   size=1e3, replace=TRUE),
    value    = sample(x=c(1:10*10,NA), size=1e3, replace=TRUE),
    stringsAsFactors = FALSE
)

以下是使用Base R的方法:

# count NAs by name-surname combos (na.action arg is important!)
agg <- aggregate(value ~ name + surname, data=df, FUN=function(x) sum(is.na(x)), na.action=NULL)

# rename is count of NAs column
names(agg)[3] <- "number_of_na"

#add count of NAs back to original data
df <- merge(df, agg, by=c("name", "surname"))

# subset the original data
result <- df[df$number_of_na < 3, ]

这是使用data.table的方法:

library(data.table)
dt <- as.data.table(df)

dt[ , number_of_na := sum(is.na(value)), by=.(name, surname)]
result <- dt[number_of_na < 3]

以下是使用dplr / tidyverse的方法:

library(dplyr) # or library(tidyverse)
result <- df %>% 
    group_by(name, surname) %>% 
    summarize(number_of_na = sum(is.na(value))) %>% 
    right_join(df, by=c("name", "surname")) %>% 
    filter(number_of_na < 3)