Если мы хотим игнорировать весь столбец, если есть хотя бы один Nation
со всеми NA
, мы можем сделать так:
cols <- grep("^Var", names(df))
df1 <- aggregate(.~Nation, df[-1], function(x) all(is.na(x)), na.action = na.pass)
df1
# Nation Var1 Var2 Var3 Var4
#1 France FALSE FALSE FALSE FALSE
#2 Italy FALSE TRUE FALSE FALSE
#3 Spain TRUE FALSE FALSE FALSE
df1
даст нам значение, если естьлюбые страны, у которых есть все NA
s в этом столбце.
cbind(df[1:2], df[cols][colSums(df1[-1]) == 0])
# Id Nation Var3 Var4
#1 1 Italy 2 3
#2 2 Italy 2 1
#3 3 Italy 1 0
#4 4 France NA 5
#5 5 France 5 3
#6 6 Italy 2 6
#7 7 Spain 2 5
#8 8 Spain 3 NA
#9 9 France 2 4
#10 10 Italy 2 3
#11 11 Spain 1 1
Опция R с одним вкладышем с использованием sapply
и ave
cbind(df[1:2], df[cols][sapply(df[cols], function(x)
!any(ave(is.na(x), df$Nation, FUN = all)))])
Используя dplyr
, мы могли бы найти имена столбцов, у которых нет Nation
, как у всех NA
и select
их вместе с Nation
и Id
.
library(dplyr)
df %>%
select(Id, Nation, df %>%
group_by(Nation) %>%
summarise_at(vars(starts_with("Var")), funs(all(is.na(.)))) %>%
select(-Nation) %>%
select_if(funs(sum(.) == 0)) %>%
names())
данные
df <- structure(list(Id = 1:11, Nation = structure(c(2L, 2L, 2L, 1L,
1L, 2L, 3L, 3L, 1L, 2L, 3L), .Label = c("France", "Italy", "Spain"
), class = "factor"), Var1 = c(1L, 2L, 1L, 1L, 1L, 5L, NA, NA,
4L, NA, NA), Var2 = c(NA, NA, NA, 1L, 2L, NA, 1L, 1L, 2L, NA,
2L), Var3 = c(2L, 2L, 1L, NA, 5L, 2L, 2L, 3L, 2L, 2L, 1L), Var4 = c(3L,
1L, 0L, 5L, 3L, 6L, 5L, NA, 4L, 3L, 1L)), .Names = c("Id", "Nation",
"Var1", "Var2", "Var3", "Var4"), class = "data.frame", row.names = c(NA, -11L))