有没有办法将数据框分成数字和字母。 例如:我的列包含以下格式的值:
Hamiltion xyx 1324-1562 abc
我想将数字前的数据分成不同的列,将数字分成不同的列。 我尝试使用gsub()和sub()但它们返回空。 请帮忙!
答案 0 :(得分:2)
以下是一些解决方案。我们假设下面的注释中的测试data.frame被用作输入。
1)使用read.table
拆分空格分隔的字段,然后再次read.table
,但这次使用sep = "-"
拆分第三列。
DF2 <- read.table(text = as.character(DF$x), as.is = TRUE)
cbind(DF2[-3], read.table(text = DF2$V3, sep = "-", col.names = c("A", "B")))
,并提供:
V1 V2 V4 A B
1 Hamiltion xyx abc 1324 1562
2 Hamiltion xyx abc 1324 1562
3 Hamiltion xyx abc 1324 1562
在测试data.frame中显示的列x
是一个因素,但如果它是一个字符列,那么as.character
可能已被省略,尽管如果你把它留在里面它不会受到伤害
2)如果模式数字仅显示在第3列中,那么此替代方案可以起作用:
read.table(text = sub("(\\d)-(\\d)", "\\1 \\2", DF$x), as.is = TRUE)
,并提供:
V1 V2 V3 V4 V5
1 Hamiltion xyx 1324 1562 abc
2 Hamiltion xyx 1324 1562 abc
3 Hamiltion xyx 1324 1562 abc
3)另一种可能性是使用此模式给出与(2)中相同的结果
pat <- "^(\\S+) (\\S+) (\\d+)-(\\d+) (\\S+)$"
read.table(text = sub(pat, "\\1 \\2 \\3 \\4 \\5", DF$x), as.is = TRUE)
4)使用与gsubfn包中的read.pattern
相同的模式,可以更紧凑地完成此操作:
library(gsubfn)
read.pattern(text = as.character(DF$x), pattern = pat)
注意:强>
# test data.frame
DF <- data.frame(x = rep("Hamiltion xyx 1324-1562 abc", 3))
答案 1 :(得分:0)
separate
包中的tidyr
函数可能很有用。
# Load package
library(tidyr)
# Create example data frame
dat <- data.frame(Col = "Hamiltion xyx 1324-1562 abc", stringsAsFactors = FALSE)
# Separate the columns into new columns
dat %>%
separate(Col, into = c("Col1", "Col2", "Col3", "Col4"), sep = " ")
# Col1 Col2 Col3 Col4
# 1 Hamiltion xyx 1324-1562 abc