我有一些数据的形式:
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
: : :
我们可以将组合变量视为成人/ child 的数量,即 2A_1C 相当于两个成人和两个 child 。
我想做的是减少可能的构图层次。对于第 5 个人,我们有 8A_1C 的组成,我正在寻找一种方法将其减少到 4+A_0C。因此,例如,对于任何大于 4A 的成分值,我们都会有 4+。
Person.ID Household.ID Composition
5 9823 4+A_1C
6 3458 1A_4+C
: : :
我不确定如何在 R 中执行此操作,我正在考虑使用 dyplyr 中的 filter() 或 select()。否则我需要使用某种正则表达式。
如有任何帮助,我们将不胜感激。谢谢
最佳答案
数据:
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
关于r - R中的剪切函数替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54331582/