很抱歉打扰一个相对简单的问题。 我有这种类型的数据框:
“ 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)
它不会引发错误,但是我有错误的印象。有什么建议吗?非常感谢
答案 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)