在 R 中有效地拆分数据框中的多个字符向量
Splitting multiple character vectors in a data frame efficiently in R
也许这有点挑剔,但我想想出一种优雅的方式来拆分数据框中的多列字符串。例如,我经常从 Excel 接收数据,其中单位与值位于相同的单元格中,如下所示:
df <- data.frame(A = paste(round(runif(5) * 10), "KG", sep = " "),
B = paste(round(runif(5) * 10), "KG", sep = " "),
C = paste(round(runif(5) * 10), "KG", sep = " "))
df
A B C
1 1 KG 9 KG 7 KG
2 8 KG 1 KG 10 KG
3 7 KG 8 KG 6 KG
4 5 KG 6 KG 9 KG
5 3 KG 2 KG 9 KG
从这里开始,单元需要分开存储。通常,我会这样做:
df2 <- as.data.frame(apply(df, 2,
function(x) as.numeric(lapply(strsplit(as.character(x),
split = " ", fixed = TRUE), "[", 1))))
df3 <- as.data.frame(apply(df, 2,
function(x) as.character( lapply(strsplit(as.character(x),
split = " ", fixed = TRUE), "[", 2))))
df4 <- cbind(df2, df3)
df4
A B C A B C
1 1 9 7 KG KG KG
2 8 1 10 KG KG KG
3 7 8 6 KG KG KG
4 5 6 9 KG KG KG
5 3 2 9 KG KG KG
它有效,但实施起来很麻烦。这类问题有更好的解决方案吗?
我们可以paste
一起阅读read.table
read.table(text=do.call(paste, df), sep="", header=FALSE, stringsAsFactors=FALSE)
# V1 V2 V3 V4 V5 V6
#1 4 KG 0 KG 6 KG
#2 2 KG 5 KG 4 KG
#3 4 KG 10 KG 1 KG
#4 9 KG 4 KG 7 KG
#5 1 KG 9 KG 5 KG
另一种选择是cSplit
library(splitstackshape)
cSplit(df, names(df), " ")
注意:值不同,因为 set.seed
未被 OP 调用。
也许这有点挑剔,但我想想出一种优雅的方式来拆分数据框中的多列字符串。例如,我经常从 Excel 接收数据,其中单位与值位于相同的单元格中,如下所示:
df <- data.frame(A = paste(round(runif(5) * 10), "KG", sep = " "),
B = paste(round(runif(5) * 10), "KG", sep = " "),
C = paste(round(runif(5) * 10), "KG", sep = " "))
df
A B C
1 1 KG 9 KG 7 KG
2 8 KG 1 KG 10 KG
3 7 KG 8 KG 6 KG
4 5 KG 6 KG 9 KG
5 3 KG 2 KG 9 KG
从这里开始,单元需要分开存储。通常,我会这样做:
df2 <- as.data.frame(apply(df, 2,
function(x) as.numeric(lapply(strsplit(as.character(x),
split = " ", fixed = TRUE), "[", 1))))
df3 <- as.data.frame(apply(df, 2,
function(x) as.character( lapply(strsplit(as.character(x),
split = " ", fixed = TRUE), "[", 2))))
df4 <- cbind(df2, df3)
df4
A B C A B C
1 1 9 7 KG KG KG
2 8 1 10 KG KG KG
3 7 8 6 KG KG KG
4 5 6 9 KG KG KG
5 3 2 9 KG KG KG
它有效,但实施起来很麻烦。这类问题有更好的解决方案吗?
我们可以paste
一起阅读read.table
read.table(text=do.call(paste, df), sep="", header=FALSE, stringsAsFactors=FALSE)
# V1 V2 V3 V4 V5 V6
#1 4 KG 0 KG 6 KG
#2 2 KG 5 KG 4 KG
#3 4 KG 10 KG 1 KG
#4 9 KG 4 KG 7 KG
#5 1 KG 9 KG 5 KG
另一种选择是cSplit
library(splitstackshape)
cSplit(df, names(df), " ")
注意:值不同,因为 set.seed
未被 OP 调用。