【问题标题】:How to split contents in a single column into two separate columns in R?如何将单个列中的内容拆分为 R 中的两个单独的列?
【发布时间】:2015-04-03 17:24:58
【问题描述】:

我的数据框中有一列:

Colname
20151102
19920311
20130204
>=70
60-69
20-29

我希望将此列拆分为两列,例如:

Col1         Col2
20151102
19920311
20130204
            >=70
            60-69
            20-29

我怎样才能达到这个结果?

【问题讨论】:

  • 如果您想将do.call(cbind, split(df, cumsum(grepl('>', df$Colname)))) 用作两个单独的列。
  • @akrun 我喜欢那个。应该发布它
  • @DavidArenburg 但是,这似乎不是 OP 想要的 :-)
  • 或者获得所需结果的选项是indx <- cumsum(grepl('>', df$Colname)); df1 <- data.frame(Col1=df$Colname, Col2=df$Colname, stringsAsFactors=FALSE); df1[!indx,1] <- ''; df1[indx,2] <- ''
  • 列也可以任意放置数据。 >=70 可以是该列的第二个条目!

标签: regex r dataframe


【解决方案1】:

无需任何包:

df[,c("Col1", "Col2")] <- ""

isnum <- suppressWarnings(!is.na(as.numeric(df$colname)))

df$Col1[isnum] <- df$colname[isnum]
df$Col2[!isnum] <- df$colname[!isnum]

df <- df[,!(names(df) %in% "colname")]

数据:

df = data.frame(colname=c("20151102","19920311","20130204",">=70","60-69","20-29"), stringsAsFactors=FALSE)

【讨论】:

  • 这种方法不会产生结果。
  • 我的错,我在创建数据框时忘记了精确的stringsAsFactors=FALSE。现在可以了。
  • 谢谢..这完成了工作:)
【解决方案2】:

一种可能的解决方案,想法是使用来自tidyrextract。请注意,我选择的分隔符(点)不能出现在您的初始 data.frame 中。

library(magrittr)
library(tidyr)

df$colname = df$colname %>% 
             grepl("[>=|-]+", .) %>% 
             ifelse(paste0(".", df$colname), paste0(df$colname, ".")) 

extract(df, colname, c("col1","col2"), "(.*)\\.(.*)")
#     col1  col2
#1  222222      
#2 1111111      
#3          >=70
#4         60-69
#5         20-29

数据:

df = data.frame(colname=c("222222","1111111",">=70","60-69","20-29"))

【讨论】:

  • 您应该交换library() 调用,否则您的代码将无法工作,因为tidyr::extractmagrittr:extract 屏蔽
  • 这种方法看起来很有希望并且可能有效,但我无法使用 tidyr。
  • 错误消息说“库中的错误(tidyr):没有名为'tidyr'的包”
  • 也许你需要先 install.packages("tidyr") ?
【解决方案3】:

这是一个单语句解决方案。 read.pattern 在括号包围的正则表达式部分中分别捕获两种字段类型。 (如果Colname 列已经属于"character" 类,则可以省略format。此外,如果希望第一列为数字,则省略colClasses 参数。)

library(gsubfn)
read.pattern(text = format(DF$Colname), pattern = "(^\\d+$)|(.*)", 
                   col.names = c("Col1", "Col2"), colClasses = "character")

给予:

      col1     col2
1 20151102         
2 19920311         
3 20130204         
4          >=70    
5          60-69   
6          20-29 

注意:这是所用正则表达式的可视化:

(^\d+$)|(.*)

Debuggex Demo

【讨论】:

    猜你喜欢
    • 2018-06-25
    • 2021-10-26
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多