Игнорировать значения NA столбца в выражении - PullRequest
1 голос
/ 17 марта 2020

До сих пор я работал с набором данных среднего размера для Обзора занятости (всего около 200 МБ), вот данные, если вы хотите просмотреть их: https://drive.google.com/drive/folders/1Od8zlOE3U3DO0YRGnBadFz804OUDnuQZ?usp=sharing

У меня есть следующий код:

hogares<-read.csv("/home/servicio/Escritorio/TR_VIVIENDA01.CSV")
personas<-read.csv("/home/servicio/Escritorio/TR_PERSONA01.CSV")
datos<-merge(hogares,personas)

library(dplyr)


base<-tibble(ID_VIV=datos$ID_VIV, ID_PERSONA=datos$ID_PERSONA, EDAD=datos$EDAD, CONACT=datos$CONACT) 
base$maxage <- ave(base$EDAD, base$ID_VIV, FUN=max)
base$Condición_I<-case_when(base$CONACT==32 & base$EDAD>=60 ~ 1,
                            base$CONACT>=10 & base$EDAD>=60 & base$CONACT<=16 ~ 2,
                            base$CONACT==20 & base$EDAD>=60 | base$CONACT==31 & base$EDAD>=60 | (base$CONACT>=33 & base$CONACT<=35 & base$EDAD>=60) ~ 3)
base <- subset(base, maxage >= 60) 
base<- base %>%  group_by(ID_VIV) %>% mutate(Condición_V = if(n_distinct(Condición_I) > 1) 4 else Condición_I)
base$ID_VIV<-as.character(base$ID_VIV)           
base$ID_PERSONA<-as.character(base$ID_PERSONA)
base

И в итоге:

# A tibble: 38,307 x 7
# Groups:   ID_VIV [10,499]
   ID_VIV      ID_PERSONA     EDAD CONACT maxage Condición_I Condición_V
   <chr>       <chr>         <int>  <int>  <int>       <dbl>       <dbl>
 1 10010000007 1001000000701    69     32     69           1           1
 2 10010000008 1001000000803    83     33     83           3           4
 3 10010000008 1001000000802    47     33     83          NA           4
 4 10010000008 1001000000801    47     10     83          NA           4
 5 10010000012 1001000001204     4     NA     60          NA           4
 6 10010000012 1001000001203     2     NA     60          NA           4
 7 10010000012 1001000001201    60     10     60           2           4
 8 10010000012 1001000001202    21     10     60          NA           4
 9 10010000014 1001000001401    67     32     67           1           4
10 10010000014 1001000001402    64     33     67           3           4

Значение столбца Condición_I является кодом для условий труда каждого человека. (строка), некоторые из этих людей живут вместе (вот почему они делят ID_VIV), я забочусь только о людях старше 60 лет, все АН - это люди, которые живут с 60 лет, но меня не волнует их положение (но мне нужно сохранить их), мне нужен столбец Condición_V , чтобы отобразить другое значение в следующих условиях:

Condición_I == 1 ~ 1
Condición_I == 2 ~ 2
Condición_I == 3 ~ 3
Any combination of Condición_I ~ 4   

Это означает, что если все 60 и + _ у людей в доме есть Condición_I == 1, тогда Condición_V будет 1 , что верно для кода 3, когда есть xe один человек C_I == 1 и еще один C_I == 3 в том же самом дом, то Condición_V будет 4 * 1 023 * И я надеюсь получить такой результат:

Тиббл: 38,307 x 7

# Groups:   ID_VIV [10,499]
   ID_VIV      ID_PERSONA     EDAD CONACT maxage Condición_I Condición_V
   <chr>       <chr>         <int>  <int>  <int>       <dbl>       <dbl>
 1 10010000007 1001000000701    69     32     69           1           1
 2 10010000008 1001000000803    83     33     83           3           3
 3 10010000008 1001000000802    47     33     83          NA           3
 4 10010000008 1001000000801    47     10     83          NA           3
 5 10010000012 1001000001204     4     NA     60          NA           2
 6 10010000012 1001000001203     2     NA     60          NA           2
 7 10010000012 1001000001201    60     10     60           2           2
 8 10010000012 1001000001202    21     10     60          NA           2
 9 10010000014 1001000001401    67     32     67           1           4
10 10010000014 1001000001402    64     33     67           3           4

Я знаю, что моя ошибка в:

`#base<- base %>%  group_by(ID_VIV) %>% mutate(Condición_V = if(n_distinct(Condición_I) > 1) 4 else` Condición_I)

Есть ли способ использовать эту строку кода, игнорируя значения NA, или это мой лучший вариант сделать это иначе, мне не нужно делать это так, как я пытаюсь, и любой другой способ или помощь будут высоко оценены!

1 Ответ

1 голос
/ 17 марта 2020

Мы можем обернуть с помощью na.omit в столбце Condición_I, проверить количество отдельных элементов с помощью n_distinct и, если оно больше 1, вернуть 4 или же вернуть na.omit столбца

library(dplyr)
base %>% 
    group_by(ID_VIV) %>% 
    mutate(Condición_V = if(n_distinct(na.omit(Condición_I)) > 1) 
            4 else na.omit(Condición_I)[1])
# A tibble: 10 x 7
# Groups:   ID_VIV [4]
#   ID_VIV      ID_PERSONA     EDAD CONACT maxage Condición_I Condición_V
#   <chr>       <chr>         <int>  <int>  <int>       <int>       <dbl>
# 1 10010000007 1001000000701    69     32     69           1           1
# 2 10010000008 1001000000803    83     33     83           3           3
# 3 10010000008 1001000000802    47     33     83          NA           3
# 4 10010000008 1001000000801    47     10     83          NA           3
# 5 10010000012 1001000001204     4     NA     60          NA           2
# 6 10010000012 1001000001203     2     NA     60          NA           2
# 7 10010000012 1001000001201    60     10     60           2           2
# 8 10010000012 1001000001202    21     10     60          NA           2
# 9 10010000014 1001000001401    67     32     67           1           4
#10 10010000014 1001000001402    64     33     67           3           4

данные

base <- structure(list(ID_VIV = c("10010000007", "10010000008", "10010000008", 
"10010000008", "10010000012", "10010000012", "10010000012", "10010000012", 
"10010000014", "10010000014"), ID_PERSONA = c("1001000000701", 
"1001000000803", "1001000000802", "1001000000801", "1001000001204", 
"1001000001203", "1001000001201", "1001000001202", "1001000001401", 
"1001000001402"), EDAD = c(69L, 83L, 47L, 47L, 4L, 2L, 60L, 21L, 
67L, 64L), CONACT = c(32L, 33L, 33L, 10L, NA, NA, 10L, 10L, 32L, 
33L), maxage = c(69L, 83L, 83L, 83L, 60L, 60L, 60L, 60L, 67L, 
67L), Condición_I = c(1L, 3L, NA, NA, NA, NA, 2L, NA, 1L, 3L
)), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
"10"), class = "data.frame")
...