splitstackshape 根据列和观察的不同行分隔符 \n 拆分文本
splitstackshape to split text based on different line separators \n for columns and observations
我有一些文本数据,如下所示:
> myData
keyColumn
1 \n\n\n\nCol1\n\nCol1 result.\n\n\n\nCol2\n\nResult col2.\n\n\n\nCol3\n\n-\n\n\n\nCol4\n\nresult col4\n\n\n\ncol5\n\n€result col5\n\n\n\nCol6\n\nresult col6\n\n\n\n\n\n
它是结构化的,我想将文本分成几列。结构总是一样的。也就是说,给定:
\n\n\n\nCol1\n\nCol1 result.
因此列名应该在 4 行分隔符之后,结果在 2 行分隔符之后。
我试过使用 splitstackshape
包。
library(splitstackshape)
cSplit(myData, splitCols = "keyColumn", sep = "\n\n\n\n", direction = "wide")
给出:
keyColumn_01 keyColumn_02 keyColumn_03 keyColumn_04 keyColumn_05 keyColumn_06 keyColumn_07 keyColumn_08 keyColumn_09 keyColumn_10 keyColumn_11 keyColumn_12
1: Col1 Col1 result. Col2 Result col2. Col3 - Col4 result col4 col5 €result col5 Col6 result col6
这不是我想要的,但接近了。
预期输出:
Col1 Col2 Col3 Col4 col5 Col6
Col1 result Result col2 - result col4 €result col5 result col6
数据:
myData <- structure(list(keyColumn = "\n\n\n\nCol1\n\nCol1 result.\n\n\n\nCol2\n\nResult col2.\n\n\n\nCol3\n\n-\n\n\n\nCol4\n\nresult col4\n\n\n\ncol5\n\n0result col5\n\n\n\nCol6\n\nresult col6\n\n\n\n\n\n"), class = "data.frame", row.names = c(NA,
-1L))
在基础 R 中你可以这样做:
read.csv(text=gsub("\n{2,}",",",gsub("\n{4}","\n",myData$keyColumn)), header = FALSE)
V1 V2
1 Col1 Col1 result.
2 Col2 Result col2.
3 Col3 -
4 Col4 result col4
5 col5 €result col5
6 Col6 result col6
由此,您可以按照自己的方式进行转置和格式化
正如 Onyambu 的回答,最好的方法是首先以某种方式将数据转换为长格式,然后将其转换为宽格式。这是一种方法:
cSplit(myData, "keyColumn", "\n", "long")[,
list(col = keyColumn[c(TRUE, FALSE)], val = keyColumn[c(FALSE, TRUE)])][,
dcast(.SD, ... ~ col, value.var = "val")]
# . Col1 Col2 Col3 Col4 col5 Col6
# 1: . Col1 result. Result col2. - result col4 €result col5 result col6
或者,在 base R 中你也可以做类似的事情:
x <- strsplit(trimws(myData$keyColumn), "\n+")[[1]]
data.frame(setNames(as.list(x[c(FALSE, TRUE)]), x[c(TRUE, FALSE)]))
# Col1 Col2 Col3 Col4 col5 Col6
# 1 Col1 result. Result col2. - result col4 €result col5 result col6
我有一些文本数据,如下所示:
> myData
keyColumn
1 \n\n\n\nCol1\n\nCol1 result.\n\n\n\nCol2\n\nResult col2.\n\n\n\nCol3\n\n-\n\n\n\nCol4\n\nresult col4\n\n\n\ncol5\n\n€result col5\n\n\n\nCol6\n\nresult col6\n\n\n\n\n\n
它是结构化的,我想将文本分成几列。结构总是一样的。也就是说,给定:
\n\n\n\nCol1\n\nCol1 result.
因此列名应该在 4 行分隔符之后,结果在 2 行分隔符之后。
我试过使用 splitstackshape
包。
library(splitstackshape)
cSplit(myData, splitCols = "keyColumn", sep = "\n\n\n\n", direction = "wide")
给出:
keyColumn_01 keyColumn_02 keyColumn_03 keyColumn_04 keyColumn_05 keyColumn_06 keyColumn_07 keyColumn_08 keyColumn_09 keyColumn_10 keyColumn_11 keyColumn_12
1: Col1 Col1 result. Col2 Result col2. Col3 - Col4 result col4 col5 €result col5 Col6 result col6
这不是我想要的,但接近了。
预期输出:
Col1 Col2 Col3 Col4 col5 Col6
Col1 result Result col2 - result col4 €result col5 result col6
数据:
myData <- structure(list(keyColumn = "\n\n\n\nCol1\n\nCol1 result.\n\n\n\nCol2\n\nResult col2.\n\n\n\nCol3\n\n-\n\n\n\nCol4\n\nresult col4\n\n\n\ncol5\n\n0result col5\n\n\n\nCol6\n\nresult col6\n\n\n\n\n\n"), class = "data.frame", row.names = c(NA,
-1L))
在基础 R 中你可以这样做:
read.csv(text=gsub("\n{2,}",",",gsub("\n{4}","\n",myData$keyColumn)), header = FALSE)
V1 V2
1 Col1 Col1 result.
2 Col2 Result col2.
3 Col3 -
4 Col4 result col4
5 col5 €result col5
6 Col6 result col6
由此,您可以按照自己的方式进行转置和格式化
正如 Onyambu 的回答,最好的方法是首先以某种方式将数据转换为长格式,然后将其转换为宽格式。这是一种方法:
cSplit(myData, "keyColumn", "\n", "long")[,
list(col = keyColumn[c(TRUE, FALSE)], val = keyColumn[c(FALSE, TRUE)])][,
dcast(.SD, ... ~ col, value.var = "val")]
# . Col1 Col2 Col3 Col4 col5 Col6
# 1: . Col1 result. Result col2. - result col4 €result col5 result col6
或者,在 base R 中你也可以做类似的事情:
x <- strsplit(trimws(myData$keyColumn), "\n+")[[1]]
data.frame(setNames(as.list(x[c(FALSE, TRUE)]), x[c(TRUE, FALSE)]))
# Col1 Col2 Col3 Col4 col5 Col6
# 1 Col1 result. Result col2. - result col4 €result col5 result col6