我将使用dplyr pipes 一步一步地展示如何做到这一点,在每一步之后打印输出,以便您了解数据结构是如何演变的。
mydata <- as.data.frame(c("Column1 = blah1; Column2 = blah2; Column3 = blah3; Column4 = blah4","Column1 = blah1; Column2 = blah2; Column3 = blah3; Column4 = blah4","Column1 = blah1; Column2 = blah2; Column3 = blah3; Column4 = blah4"))
names(mydata) <- "TEST"
看起来是这样的:
> mydata
TEST
1 Column1 = blah1; Column2 = blah2; Column3 = blah3; Column4 = blah4
2 Column1 = blah1; Column2 = blah2; Column3 = blah3; Column4 = blah4
3 Column1 = blah1; Column2 = blah2; Column3 = blah3; Column4 = blah4
以下是转换它的步骤:
library(dplyr)
library(tidyr)
1) 以变量分隔
mydata %>%
separate(rows, into=paste0("Column", 1:4), sep=";")
输出:
Column1 Column2 Column3 Column4
1 Column1 = blah1 Column2 = blah2 Column3 = blah3 Column4 = blah4
2 Column1 = blah1 Column2 = blah2 Column3 = blah3 Column4 = blah4
3 Column1 = blah1 Column2 = blah2 Column3 = blah3 Column4 = blah4
2) 添加行标识符
mydata %>%
separate(TEST, into=paste0("Column", 1:4), sep=";") %>%
mutate(row=row.names(mydata))
输出:
Column1 Column2 Column3 Column4 row
1 Column1 = blah1 Column2 = blah2 Column3 = blah3 Column4 = blah4 1
2 Column1 = blah1 Column2 = blah2 Column3 = blah3 Column4 = blah4 2
3 Column1 = blah1 Column2 = blah2 Column3 = blah3 Column4 = blah4 3
3) 重新格式化为 long
mydata %>%
separate(TEST, into=paste0("Column", 1:4), sep=";") %>%
mutate(row=row.names(mydata)) %>%
gather("key", "value", -row)
输出:
row key value
1 1 Column1 Column1 = blah1
2 2 Column1 Column1 = blah1
3 3 Column1 Column1 = blah1
4 1 Column2 Column2 = blah2
5 2 Column2 Column2 = blah2
6 3 Column2 Column2 = blah2
7 1 Column3 Column3 = blah3
8 2 Column3 Column3 = blah3
9 3 Column3 Column3 = blah3
10 1 Column4 Column4 = blah4
11 2 Column4 Column4 = blah4
12 3 Column4 Column4 = blah4
4) 然后提取数据
mydata %>%
separate(TEST, into=paste0("Column", 1:4), sep=";") %>%
mutate(row=row.names(mydata)) %>%
gather("key", "value", -row) %>%
extract(value, into="value", regex=".* = (.*)$")
输出:
row key value
1 1 Column1 blah1
2 2 Column1 blah1
3 3 Column1 blah1
4 1 Column2 blah2
5 2 Column2 blah2
6 3 Column2 blah2
7 1 Column3 blah3
8 2 Column3 blah3
9 3 Column3 blah3
10 1 Column4 blah4
11 2 Column4 blah4
12 3 Column4 blah4
5) 如果需要,将其展开成宽幅格式
mydata %>%
separate(TEST, into=paste0("Column", 1:4), sep=";") %>%
mutate(row=row.names(mydata)) %>%
gather("key", "value", -row) %>%
extract(value, into="value", regex=".* = (.*)$") %>%
spread(key, value)
输出:
row Column1 Column2 Column3 Column4
1 1 blah1 blah2 blah3 blah4
2 2 blah1 blah2 blah3 blah4
3 3 blah1 blah2 blah3 blah4
6) 如果需要,删除行标识符
mydata %>%
separate(TEST, into=paste0("Column", 1:4), sep=";") %>%
mutate(row=row.names(mydata)) %>%
gather("key", "value", -row) %>%
extract(value, into="value", regex=".* = (.*)$") %>%
spread(key, value) %>%
select(-row)
输出:
Column1 Column2 Column3 Column4
1 blah1 blah2 blah3 blah4
2 blah1 blah2 blah3 blah4
3 blah1 blah2 blah3 blah4