带有调查的分类任务:摆脱给定国家中人们没有回答的问题

时间:2019-02-03 12:37:06

标签: r dataframe dataset missing-data

下午好,这种调查数据集存在一些问题

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

预先感谢您的帮助,

最好, 卡洛

1 个答案:

答案 0 :(得分:0)

如果我们想忽略整个列,即使其中只有NationNA,我们可以做

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

使用sapplyave的单线基本R选项

cbind(df[1:2], df[cols][sapply(df[cols], function(x) 
               !any(ave(is.na(x), df$Nation, FUN = all)))])

使用dplyr,我们可以找出没有Nation的列的名称,因为所有NAselect以及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())