如何将单列中的内容拆分为 R 中的两个单独的列?
How to split contents in a single column into two separate columns in R?
我的数据框中有一列:
Colname
20151102
19920311
20130204
>=70
60-69
20-29
我希望将此列拆分为两列,例如:
Col1 Col2
20151102
19920311
20130204
>=70
60-69
20-29
我怎样才能达到这个结果?
一个可能的解决方案,想法是使用 tidyr
中的 extract
。请注意,我选择的分隔符(点)不得出现在您的初始 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"))
这是一个单语句解决方案。 read.pattern
在括号中的正则表达式部分分别捕获两种字段类型。 (如果 Colname
列已经是 class "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+$)|(.*)
不需要任何包:
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)
我的数据框中有一列:
Colname
20151102
19920311
20130204
>=70
60-69
20-29
我希望将此列拆分为两列,例如:
Col1 Col2
20151102
19920311
20130204
>=70
60-69
20-29
我怎样才能达到这个结果?
一个可能的解决方案,想法是使用 tidyr
中的 extract
。请注意,我选择的分隔符(点)不得出现在您的初始 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"))
这是一个单语句解决方案。 read.pattern
在括号中的正则表达式部分分别捕获两种字段类型。 (如果 Colname
列已经是 class "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+$)|(.*)
不需要任何包:
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)