【问题标题】:How to split a dataframe column into two columns如何将数据框列拆分为两列
【发布时间】:2022-01-20 00:51:07
【问题描述】:

我正在寻找如何将单个数据框列拆分为两列并将符号替换为另一列。例如,如果数据框 y 有;

X1
NA
1/0:0.82
1/1:1.995
0/1:1.146
NA
1/1:1.995

我希望能够像这样将数据分成两列,并将“/”符号替换为“。”。

X1 X2
NA
1.0 0.82
1.1 1.995
0.1 1.146
NA
1.1 1.995

每当我尝试使用 str.split 时,我都会遇到错误。任何帮助都会很棒。

编辑:

X1


不适用

1|0:0.82

1|1:1.995

0|1:1.146

不适用

1|1:1.995

如何将其分开 |X1|X2| |--|--| |不适用| |1/0|0.82| 等等

【问题讨论】:

    标签: r dataframe split


    【解决方案1】:

    使用strsplit

    d$d
    [1] NA          "1/0:0.82"  "1/1:1.995" "0/1:1.146" NA          "1/1:1.995"
    
    data.frame( unname( t(data.frame( strsplit(sub("/",".",d$d), ":") )) ) )
        X1    X2
    1 <NA>  <NA>
    2  1.0  0.82
    3  1.1 1.995
    4  0.1 1.146
    5 <NA>  <NA>
    6  1.1 1.995
    

    数据

    d <- structure(list(d = c(NA, "1/0:0.82", "1/1:1.995", "0/1:1.146",
    NA, "1/1:1.995")), class = "data.frame", row.names = c(NA, -6L
    ))
    

    编辑,对于任何其他替代用途:

    d$d
    [1] NA          "1|0:0.82"  "1|1:1.995" "0|1:1.146" NA          "1|1:1.995"
    
    data.frame( unname( t(data.frame( strsplit(sub("\\|","/",d$d), ":") )) ) )
        X1    X2
    1 <NA>  <NA>
    2  1/0  0.82
    3  1/1 1.995
    4  0/1 1.146
    5 <NA>  <NA>
    6  1/1 1.995
    

    【讨论】:

      【解决方案2】:

      您可以使用separate: 上的数据拆分为两列,并将第一列中的/ 替换为.。使用来自@Onyambu 的数据 -

      library(dplyr)
      library(tidyr)
      
      df <- df %>%
        separate(X1, c('X1', 'X2'), sep = ':') %>%
        mutate(X1 = sub('/', '.', X1)) %>%
        type.convert(as.is = TRUE)
      
      df
      
      #   X1    X2
      #1  NA    NA
      #2 1.0 0.820
      #3 1.1 1.995
      #4 0.1 1.146
      #5  NA    NA
      #6 1.1 1.995
      

      【讨论】:

        【解决方案3】:
        read.table(text=df$X1, sep=':', fill=T, h=F, dec = '/')
           V1    V2
        1  NA      
        2 1.0  0.82
        3 1.1 1.995
        4 0.1 1.146
        5  NA      
        6 1.1 1.995
        

        如果你想要各自 data.types 中的列:

        type.convert(read.table(text=df$X1, sep=':', fill=T, h=F, dec = '/'), as.is = TRUE)
           V1    V2
        1  NA    NA
        2 1.0 0.820
        3 1.1 1.995
        4 0.1 1.146
        5  NA    NA
        6 1.1 1.995
        

        df <- structure(list(X1 = c(NA, "1/0:0.82", "1/1:1.995", "0/1:1.146", NA,
                         "1/1:1.995")), class = "data.frame", row.names = c(NA, -6L))
        

        【讨论】:

        • 非常感谢您,如果我想将“/”转换为“.”以外的其他内容像“
        • @RobertS - 我不认为您可以像 Onyambu 所做的那样直接使用伪小数点来修复它。之后您必须使用 sub("/", "&lt;", output$V1) 或类似方法修复它
        • @RobertS 我的输出没有小数点 .。因此,您只需使用格式功能。即format(output$V1, dec = '&lt;')
        • @thelatemail 注意我的输出不包含/
        • 酷,因为我有另一个文件,其中数字用“|”分隔我希望将其更改为“/”符号,但我一直遇到在数字前添加“/”的问题。(即我不断得到“/1|0”而不是“1/0”)跨度>
        猜你喜欢
        • 2013-01-22
        • 1970-01-01
        相关资源
        最近更新 更多