下午好,这种调查数据集存在一些问题
Id Nation Var1 Var2 Var3 Var4 .... Var200
1 Italy 1 NA 2 3
2 Italy 2 NA 2 1
3 Italy 1 NA 1 0
4 France 1 1 NA 5
5 France 1 2 5 3
6 Italy 5 NA 2 6
7 Spain NA 1 2 5
8 Spain NA 1 3 NA
9 France 4 2 2 4
10 Italy NA NA 2 3
11 Spain NA 2 1 1
基本上,有很多缺失值,并且主要的问题是某些国家的某些变量都具有所有缺失值(在此示例中,var2在意大利没有记录值,而var1在西班牙没有记录值) )。 我正在尝试应用分类树来预测原产国。 由于我想使用PCA重建一些缺失的值(对您来说听起来合理吗?)或类似的东西, 我首先需要摆脱没有针对特定国家的记录的问题(例如,如果数据集中至少一个国家没有记录的值,则丢弃变量的方法)。 我该如何消除这些变量?
对于这个特定的例子,这就是我想要获得的东西
Id Nation Var3 Var4 .... Var200
1 Italy 2 3 ...
2 Italy 2 1 ...
3 Italy 1 0
4 France NA 5
5 France 5 3
6 Italy 2 6
7 Spain 2 5
8 Spain 3 NA
9 France 2 4
10 Italy 2 3
11 Spain 1 1
预先感谢您的帮助,
最好, 卡洛
答案 0 :(得分:0)
如果我们想忽略整个列,即使其中只有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
的国家/地区的价值。
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
使用sapply
和ave
的单线基本R选项
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
和{{ 1}}。
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())