将r中的数据帧拆分为字符和数字

时间:2017-04-12 00:27:49

标签: r

有没有办法将数据框分成数字和字母。 例如:我的列包含以下格式的值:

Hamiltion xyx 1324-1562 abc

我想将数字前的数据分成不同的列,将数字分成不同的列。 我尝试使用gsub()和sub()但它们返回空。 请帮忙!

2 个答案:

答案 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