我们可以使用trimws
函数去除前缀子字符串,然后使用read.table
函数并将sep
参数设为默认空格来读取列数据,以在base R
中返回一个包含两列的data.frame
。
read.table(text = trimws(DATA$V1, whitespace = ".*:\\s+"),
header = FALSE, col.names = c("VAR1", "VAR2"))
VAR1 VAR2
1 9.93100 5.09200
2 6.00007 15.12480
3 1.00020 12.98753
4 3.10000 3.98532
或者可以使用 tidyr
中的 extract
函数。
library(tidyr)
extract(DATA, V1, into = c("VAR1", "VAR2"),
".*:\\s+([0-9.]+)\\s+([0-9.]+)", convert = TRUE)
VAR1 VAR2
1 9.93100 5.09200
2 6.00007 15.12480
3 1.00020 12.98753
4 3.10000 3.98532
如果我们想要使用
fread
读取
data.table
,可以在移除前缀子字符串后使用相同的方法。
library(data.table)
fread(text = setDT(DATA)[, trimws(V1, whitespace = ".*:\\s+")],
col.names = c("VAR1", "VAR2"))
VAR1 VAR2
<num> <num>
1: 9.93100 5.09200
2: 6.00007 15.12480
3: 1.00020 12.98753
4: 3.10000 3.98532
或者使用 fread
中的 select
选项。
fread(text = DATA$V1, select = c(3, 4), col.names = c("VAR1", "VAR2"))
VAR1 VAR2
<num> <num>
1: 9.93100 5.09200
2: 6.00007 15.12480
3: 1.00020 12.98753
4: 3.10000 3.98532
或者将其读作四列,并进行子集
fread(text = DATA$V1)[, .(VAR1 = V3, VAR2 = V4)]
VAR1 VAR2
<num> <num>
1: 9.93100 5.09200
2: 6.00007 15.12480
3: 1.00020 12.98753
4: 3.10000 3.98532
或者可以使用 tstrsplit
setDT(DATA)[, c("VAR1", "VAR2") := tstrsplit(trimws(V1,
whitespace = ".*:\\s+"), " ")]
DATA <- type.convert(DATA, as.is = TRUE)
DATA
V1 VAR1 VAR2
<char> <num> <num>
1: SCORE : 9.931 5.092 9.93100 5.09200
2: SCORE : 6.00007 15.1248 6.00007 15.12480
3: SCORE : 1.0002 12.987532 1.00020 12.98753
4: SCORE : 3.1 3.98532 3.10000 3.98532