如何通过模式将单个字符串向量解析为列名/列值

时间:2017-09-11 18:18:30

标签: r data-science

我有一个单独的列,其中包含单独的字符串值:

                                     strings
1 J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61
2 J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61

我想使用模式将其转换为数据框。例如,字符串中的前两个字符位置是第一列的名称(J9),第三个位置是第一列的值(6)。模式是2,1,2,1 ......

我想要的是类似于Excel中的text-to-columns功能。我怎么能在R?

中做到这一点

预期产出:

J9 C7 5D
6  5  5  and so on..
6  5  5  and so on..

2 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点,但这里有一种直观的方式可以帮助教授一些有用的R概念:

x <- c("J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61")

colNames <- paste0(unlist(strsplit(x, ""))[c(TRUE,FALSE,FALSE)],
                   unlist(strsplit(x, ""))[c(FALSE,TRUE,FALSE)])

values <- paste0(unlist(strsplit(x, ""))[c(FALSE,FALSE,TRUE)])

df <- data.frame(matrix(values,nrow=1))
colnames(df) <- colNames  

输出:

  J9 C7 D5 I9 Z9 W3 S7 H8 K6 Y4 B9 R4 L4 U6
1  6  5  6  6  5  9  9  9  9  9  9  9  9  1

修改

如果您有多个这样的字符串,您必须合并到数据框中,这里有一个选项:

df <- data.frame(strings=c("J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61",
                           "J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61"),
                 stringsAsFactors = FALSE)

colNames <- paste0(unlist(strsplit(df[1,], ""))[c(TRUE,FALSE,FALSE)],
                   unlist(strsplit(df[1,], ""))[c(FALSE,TRUE,FALSE)])

x <- lapply(df$strings,
            function(i) matrix(paste0(unlist(strsplit(i,""))[c(FALSE,FALSE,TRUE)]),nrow=1))

require(plyr)
df <- data.frame(rbind.fill.matrix(x))
colnames(df) <- colNames

输出:

  J9 C7 D5 I9 Z9 W3 S7 H8 K6 Y4 B9 R4 L4 U6
1  6  5  6  6  5  9  9  9  9  9  9  9  9  1
2  6  5  6  6  5  9  9  9  9  9  9  9  9  1

答案 1 :(得分:0)

如果您的行长度相同(.txt文件中的常见内容),您可以尝试使用固定宽度格式:

read.fwf()

类似

read.fwf(yourfile.txt, widths=c(2,1,2,1), colnames=c(variable1,value1,variable2,value2))