Классификация Задача с опросом: избавиться от вопросов, на которые не отвечают люди в данной стране - PullRequest
0 голосов
/ 03 февраля 2019

Добрый день, у меня возникли некоторые проблемы с набором данных опроса этого типа

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 голосов
/ 03 февраля 2019

Если мы хотим игнорировать весь столбец, если есть хотя бы один 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...