【问题标题】:How do I split a column in R into two columns when I have no delimiter?当我没有分隔符时,如何将 R 中的列拆分为两列?
【发布时间】:2020-02-11 23:02:02
【问题描述】:

我有一个名为 data1 的数据集,我需要将第一列分成两列。我遇到的问题是我需要拆分的内容之间没有分隔符,并且字符长度不同是很多行。

我想按日期和性别分开。

例如

12/1/09male
1/9/20female
13/1/19female
4/12/12male

我一直在尝试这个,但是因为值有不同数量的字符,我被卡住了。

separate(data1, col = 1, into = c("date","sex"), sep = "")

任何帮助将不胜感激!

【问题讨论】:

    标签: r csv


    【解决方案1】:

    一个选项是一个积极的后视和前瞻,以分割一个数字,后跟"m""f"

    df %>% separate(1, c("date", "sex"), sep = "(?<=\\d)(?=[mf])")
    #    date    sex
    #1 12/1/09   male
    #2  1/9/20 female
    #3 13/1/19 female
    #4 4/12/12   male
    

    不管怎样,同样的正则表达式模式适用于 base R 的strsplit

    setNames(do.call(
        rbind.data.frame,
        strsplit(as.character(df[, 1]), "(?<=\\d)(?=[mf])", perl = T)),
        c("date", "sex"))
    

    样本数据

    df <- read.table(text =
    '12/1/09male
    1/9/20female
    13/1/19female
    4/12/12male')
    

    【讨论】:

      【解决方案2】:

      我对 R 相当陌生,所以我确信这不是最优雅的解决方案。我先在日期和性别之间加一个逗号,然后在逗号上隔开

      a <- data.frame(row_1 = c("12/1/09male", "1/9/20female", "13/1/19female", "4/12/12male"))
      a[, "row_1"] = str_replace(a$row_1, "(male|female)", ",\\1")
      separate(a, row_1, ",", into = c("date", "sex"))
      

      【讨论】:

        【解决方案3】:

        使用tidyr::extract,我们可以将数据捕获为两部分。首先捕获日期(格式为 d/m/y),然后捕获字符串的所有剩余部分。

        tidyr::extract(df, V1, c("date", "sex"), "(\\d+/\\d+/\\d+)(.*)")
        
        #     date    sex
        #1 12/1/09   male
        #2  1/9/20 female
        #3 13/1/19 female
        #4 4/12/12   male
        

        数据

        df <- structure(list(V1 = structure(c(2L, 1L, 3L, 4L), .Label = c("1/9/20female", 
        "12/1/09male", "13/1/19female", "4/12/12male"), class = "factor")), 
        class = "data.frame", row.names = c(NA,-4L))
        

        【讨论】:

          【解决方案4】:

          使用 gsub 和一些正则表达式的基本 R 解决方案:

          df_clean <- within(df, {
              date <- as.Date(gsub("[A-Za-z]+", "", V1), format = "%d/%m/%y")
              sex  <- as.factor(gsub("\\d+|\\/", "", V1))
              rm(V1)
            }
          )
          

          数据:

          df <- structure(list(V1 = structure(c(2L, 1L, 3L, 4L), .Label = c("1/9/20female", 
          "12/1/09male", "13/1/19female", "4/12/12male"), class = "factor")), class = "data.frame", row.names = c(NA, 
          -4L))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-10
            • 1970-01-01
            相关资源
            最近更新 更多