【问题标题】:Split a data frame column based on a comma [duplicate]根据逗号拆分数据框列[重复]
【发布时间】:2019-09-17 02:10:36
【问题描述】:

我有一个具有以下结构的数据框,标题为“final_proj_data”

ID          County              Population     Year  
<dbl>       <chr>               <dbl>          <dbl>    
1003    Baldwin County, Alabama 169162         2006     
1015    Calhoun County, Alabama 112903         2006     
1043    Cullman County, Alabama 80187          2006     
1049    DeKalb County, Alabama  68014          2006 

我正在尝试将 County 列拆分为两个不同的列,即 County 和 State,并删除逗号。

我尝试了separate() 函数的多种排列,但我不断收到此错误:

错误:var 必须计算为单个数字或列名,而不是 字符向量

我已经尝试过(以及其他)

  final_proj_data %>% 
separate(final_proj_data$County, c("State", "County"), sep = ",", remove = TRUE)
    final_proj_data %>% 
separate(data = final_proj_data, col = County,
 into = c("State", "County"), sep = ",")

我不确定我做错了什么,或者为什么“col =”一直抛出这个错误。任何帮助将不胜感激!

【问题讨论】:

  • 试试final_proj_data %&gt;% separate(County, into = c("County", "State"), sep = ",")
  • 您的代码的问题是您使用的是$,它通常不适合与dplyr 管道链接的数据一起使用,因此您应该将separate(final_proj_data$County,.....) 替换为@987654328 @.
  • @RonakShah,谢谢!那行得通!抱歉,这个问题有点基础,但我对 R 很陌生,而且链接并不是我在其他编程中经常使用的东西。

标签: r dplyr tidyr


【解决方案1】:

使用 dplyr 和基础 R:

library(dplyr)
 final_proj_data %>% 
 mutate(State=unlist(lapply(strsplit(County,", "),function(x) x[2])),
       County=gsub(",.*","",County))
    ID         County Population Year   State
1 1003 Baldwin County     169162 2006 Alabama
2 1015 Calhoun County     112903 2006 Alabama
3 1043 Cullman County      80187 2006 Alabama
4 1049  DeKalb County      68014 2006 Alabama

原创:

使用dplyr 和tidyr(刚刚看到@Ronak Shah 在上面发表了相同的评论):

library(dplyr)
library(tidyr)
final_proj_data %>% 
   separate(County,c("County","State"),sep=",")
    ID         County    State Population Year
1 1003 Baldwin County  Alabama     169162 2006
2 1015 Calhoun County  Alabama     112903 2006
3 1043 Cullman County  Alabama      80187 2006
4 1049  DeKalb County  Alabama      68014 2006

【讨论】:

    【解决方案2】:

    我们可以尝试在此处使用sub 作为基本 R 选项:

    County <- sub(",.*$", "", final_proj_data$County)
    State <- sub("^.*,\\s*", "", final_proj_data$County)
    final_proj_data$County <- County
    final_proj_data$State <- State
    

    【讨论】:

      【解决方案3】:

      我们可以在base R 中使用read.csv 执行此操作

      final_proj_data[c("County", "State")] <- read.csv(text = final_proj_data$County, 
                    header = FALSE, stringsAsFactors = FALSE, strip.white = TRUE)
      final_proj_data
      #    ID         County Population Year   State
      #1 1003 Baldwin County     169162 2006 Alabama
      #2 1015 Calhoun County     112903 2006 Alabama
      #3 1043 Cullman County      80187 2006 Alabama
      #4 1049  DeKalb County      68014 2006 Alabama
      

      数据

      final_proj_data <- structure(list(ID = c(1003L, 1015L, 1043L, 1049L), 
         County = c("Baldwin County, Alabama", 
      "Calhoun County, Alabama", "Cullman County, Alabama", "DeKalb County, Alabama"
      ), Population = c(169162L, 112903L, 80187L, 68014L), Year = c(2006L, 
      2006L, 2006L, 2006L)), class = "data.frame", row.names = c(NA, 
      -4L))
      

      【讨论】:

        【解决方案4】:

        我们可以在基础 R 中使用strsplit。

        cbind(d, `colnames<-`(do.call(rbind, strsplit(d$County, ", ")), c("County", "State")))[-2]
        #     ID Population Year         County   State
        # 1 1003     169162 2006 Baldwin County Alabama
        # 2 1015     112903 2006 Calhoun County Alabama
        # 3 1043      80187 2006 Cullman County Alabama
        # 4 1049      68014 2006  DeKalb County Alabama
        

        注意:如果County 是因子列,则使用strsplit(as.character(d$County), ", ")。

        数据

        d <- structure(list(ID = c("1003", "1015", "1043", "1049"), County = c("Baldwin County, Alabama", 
        "Calhoun County, Alabama", "Cullman County, Alabama", "DeKalb County, Alabama"
        ), Population = c("169162", "112903", "80187", "68014"), Year = c("2006", 
        "2006", "2006", "2006")), row.names = c(NA, -4L), class = "data.frame")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-25
          • 2018-11-11
          • 1970-01-01
          • 1970-01-01
          • 2020-05-28
          • 1970-01-01
          • 2018-06-22
          相关资源
          最近更新 更多