【问题标题】:How to turn convert one character column into multiple numerical columns in R如何将一个字符列转换为R中的多个数字列
【发布时间】:2021-04-07 04:43:30
【问题描述】:

我想把一个字符列分成多个数值列。

例如,我在“final”表中有这些列:

最终

sd2 file
0.011 r100.0.8.1.1.csv
0.023 r10.0.2.0.1.csv
0.033 r10.0.95.0.0.csv

我想把它变成像下面这样的东西。 “文件”列分为 3 个单独的列,其中不再有“r”或“.csv”,前两个数字(即 100 和 0.8)在不同的列中,但最后一个(即 1.1)保留在一列 - 尽管如果更容易,这可以进一步分成两列(即“dom”列中的 1 和 1 可以在单独的列中)。

sd2 pop sel dom
0.011 100 0.8 1.1
0.023 10 0.2 0.1
0.033 10 0.95 0.0

我使用 strsplit 使“文件”列成为字符串列表。

files <- final$file
files <- as.character(files)

per <- strsplit(files, "[.]")

我不确定如何将这些字符串转换为单独的列,同时放弃“r”和“.col”任何关于后续步骤的建议将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    read.csv 的选项来自base R。在这里,我们可以将子字符串捕获为一个组,用,修改分隔符,并使用read.csv将列读取为data.frame并将新列分配给base R中的“最终”数据集

    final[c("pop", "sel", "dom")] <-  read.csv(text = 
      sub("^[a-z](\\d+)\\.(\\d+\\.\\d+)\\.([0-9.]+)\\.csv",
           "\\1,\\2,\\3", final$file), header = FALSE)
    

    extracttidyr 中可以使用相同的选项

    library(tidyr)
    final %>%
        extract(file, into = c("pop", "sel", "dom"),
             "^[a-z](\\d+)\\.(\\d+\\.\\d+)\\.([0-9.]+)\\.csv", convert = TRUE)
    

    -输出

    #    sd2 pop  sel dom
    #1 0.011 100 0.80 1.1
    #2 0.023  10 0.20 0.1
    #3 0.033  10 0.95 0.0
    

    数据

    final <- structure(list(sd2 = c(0.011, 0.023, 0.033), file = c("r100.0.8.1.1.csv", 
    "r10.0.2.0.1.csv", "r10.0.95.0.0.csv")), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案2】:

      一个选项是strsplit 在字母或点上,由非空元素组成一个矩阵,这些元素的相关列是我们paste"."

      u <- unlist(strsplit(d$file, "[a-z]|\\."))
      u <- matrix(u[nchar(u) > 0],,5,b=T)
      res <- data.frame(sd2=d$sd2, sapply(list(pop=1, sel=2:3, dom=4:5), function(x) 
        as.double(apply(u[, x, drop=F], 1, paste, collapse="."))))
      res
      #     sd2 pop  sel dom
      # 1 0.011 100 0.80 1.1
      # 2 0.023  10 0.20 0.1
      # 3 0.033  10 0.95 0.0
      

      数据:

      d <- structure(list(sd2 = c(0.011, 0.023, 0.033), file = c("r100.0.8.1.1.csv", 
      "r10.0.2.0.1.csv", "r10.0.95.0.0.csv")), class = "data.frame", row.names = c(NA, 
      -3L))
      

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 2014-09-15
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-17
        相关资源
        最近更新 更多