首页 > 解决方案 > R基于字符串列中的元素重复行

问题描述

我有一个或多或少的具体问题,可能与 R 中的循环有关。我有一个数据框:

X       location                                     year         
1      North Dakota, Minnesota, Michigan             2011
2      California, Tennessee                         2012
3      Bastrop County (Texas)                        2013
4      Dallas (Texas)                                2014
5      Shasta (California)                           2015
6      California, Oregon, Washington                2011

我对这些数据有两个问题:1)我需要一个仅包含每行的状态名称的列。我想这应该很容易使用 gsub 并使用所有美国州名的列表。

list <- c("Alabama", "Alaska",  "Arizona", "Arkansas", "California", "etc")


pat <- paste0("\\b(", paste0(list, collapse="|"), ")\\b")    
pat

data$state <- gsub(data$location, "", paragraph)

对我来说更大的问题是 2)我需要为数据集中的每个状态单独(重复)行。因此,如果第 6 行在 2011 年有加利福尼亚、俄勒冈和华盛顿,我需要像这样分别为每个单独的行:

X       location                                     year         
1      California                                    2011
2      Oregon                                        2011
3      Washington                                    2011

感谢您的帮助!

标签: rstringloopsdataframe

解决方案


您可以使用str_extract_all提取所有状态并unnest复制行,以便每个状态位于单独的行中。有一个内置常量state.name,它具有美国的州名,可用于创建模式。

library(dplyr)
pat <- paste0("\\b", state.name, "\\b", collapse = "|")    

df %>%
  mutate(states = stringr::str_extract_all(location, pat)) %>% 
  tidyr::unnest(states)


# A tibble: 11 x 3
#   location                           year states      
#   <chr>                             <int> <chr>       
# 1 North Dakota, Minnesota, Michigan  2011 North Dakota
# 2 North Dakota, Minnesota, Michigan  2011 Minnesota   
# 3 North Dakota, Minnesota, Michigan  2011 Michigan    
# 4 California, Tennessee              2012 California  
# 5 California, Tennessee              2012 Tennessee   
# 6 Bastrop County (Texas)             2013 Texas       
# 7 Dallas (Texas)                     2014 Texas       
# 8 Shasta (California)                2015 California  
# 9 California, Oregon, Washington     2011 California  
#10 California, Oregon, Washington     2011 Oregon      
#11 California, Oregon, Washington     2011 Washington  

数据

df <- structure(list(location = c("North Dakota, Minnesota, Michigan", 
"California, Tennessee", "Bastrop County (Texas)", "Dallas (Texas)", 
"Shasta (California)", "California, Oregon, Washington"), year = c(2011L, 
2012L, 2013L, 2014L, 2015L, 2011L)), class = "data.frame", row.names = c(NA, -6L))

推荐阅读