Вырезать альтернативу функции в R - PullRequest
0 голосов
/ 23 января 2019

У меня есть некоторые данные в форме:

Person.ID    Household.ID    Composition 
   1             4593           1A_0C
   2             4992           2A_1C
   3             9843           1A_1C 
   4             8385           2A_2C  
   5             9823           8A_1C 
   6             3458           1C_9C 
   7             7485           2C_0C 
   :               :              :    

Мы можем представить переменную композиции как число взрослых / детей, то есть 2A_1C будет равно двум взрослым и двум детям.

Что я хочу сделать, так это уменьшить количество возможных уровней композиции.Для человека 5 у нас есть состав 8A_1C, я ищу способ уменьшить это до 4 + A_0C.Так, например, у нас было бы 4+ для любого значения композиции с более чем 4А.

Person.ID     Household.ID     Composition 
    5             9823            4+A_1C
    6             3458             1A_4+C
    :               :                :

Я не уверен, как это сделать в R, я думаю об использовании filter () или select () из dyplyr .В противном случае мне нужно использовать какое-то регулярное выражение.

Любая помощь будет оценена.Спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Данные:

Person.ID <- c(1,2,3,4,5,6,7,8)
Household.ID <- c(4593,4992,9843,8385,9823,3458,7485)
Composition <- c("1A_0C","2A_1C","1A_1C","2A_2C","8A_1C","1A_9C","2A_0C")
dat <- tibble(Person.ID, Household.ID, Composition)

Функция:

above4 <- function(f){
    ff <- gsub("[^0-9]","",f)
    if(ff>4){return("4+")}
    if(ff<=4){return(ff)}
}

Применить функцию (выполняется для разделенных данных, но может рекомбинироваться после):

dat_ <- dat %>% tidyr::separate(., col=Composition, 
                           into=c("Adults", "Children"), 
                           sep="_") %>%
        dplyr::mutate(Adults_ = unlist(lapply(Adults,above4)), 
                         Children_ = unlist(lapply(Children,above4)))

Вы можетезатем используйте select, filter, чтобы получить требуемый набор данных.

dat_ %>% dplyr::mutate(Composition_ = paste0(Adults_, "A_", Children_, "C")) %>%
         dplyr::select(Person.ID, Household.ID, Composition=Composition_)

 # A tibble: 7 x 3
      Person.ID Household.ID Composition
          <dbl>        <dbl> <chr>
    1        1.        4593. 1A_0C
    2        2.        4992. 2A_1C
    3        3.        9843. 1A_1C
    4        4.        8385. 2A_2C
    5        5.        9823. 4+A_1C
    6        6.        3458. 1A_4+C
    7        7.        7485. 2A_0C
0 голосов
/ 23 января 2019

Мы можем использовать gsub:

df$Composition <- gsub("(?<!\\d)([5-9]|\\d{2,})(?=[AC])", "4+", df$Composition, perl = TRUE)

Предполагается, что 2 или более последовательных цифры представляют число, которое всегда больше 4 (т. Е. Нет 01, 02 или 001).

Выход:

  Person.ID Household.ID Composition
1         1         4593       1A_0C
2         2         4992       2A_1C
3         3         9843       1A_1C
4         4         8385       2A_2C
5         5         9823      4+A_1C
6         6         3458      1C_4+C
7         7         7485       2C_0C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...