【问题标题】:R duplicate rows based on the elements in a string column [duplicate]R基于字符串列中的元素重复行[重复]
【发布时间】:2020-11-09 11:38:09
【问题描述】:

我有一个或多或少的具体问题,可能与 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

感谢您的帮助!

【问题讨论】:

    标签: r string loops dataframe


    【解决方案1】:

    您可以使用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))
    

    【讨论】:

    • 这真的很棒。感谢您的快速回复!
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多