R 如何使用空格将列一分为二
我有下面的输入数据框。我需要根据df之间的空白将其拆分为两列[l,r]。问题是编译环境中不存在大多数库。有没有其他不使用“dplyr”或“tidyr”的方法 输入R 如何使用空格将列一分为二,r,R,我有下面的输入数据框。我需要根据df之间的空白将其拆分为两列[l,r]。问题是编译环境中不存在大多数库。有没有其他不使用“dplyr”或“tidyr”的方法 输入 df val 1 5 5 2 2 7 3 8 10 4 10 20 5 4 5 df l r 1 5 5 2 2 7 3 8 10 4 10 20 5 4 5 输出 df val 1 5 5 2 2 7 3 8 10 4 10 20 5 4 5 df l
df
val
1 5 5
2 2 7
3 8 10
4 10 20
5 4 5
df
l r
1 5 5
2 2 7
3 8 10
4 10 20
5 4 5
输出
df
val
1 5 5
2 2 7
3 8 10
4 10 20
5 4 5
df
l r
1 5 5
2 2 7
3 8 10
4 10 20
5 4 5
通过使用
read.table
读取列“val”,可以更轻松地使用base R
,并自动在空白处拆分列。只需指定列名(如果我们需要),否则它将创建默认名称。优点是,如果我们使用strsplit
read.table(text = df$val, header = FALSE, col.names = c('l', 'r'))
> setDT(df)[, tstrsplit(val, " ", type.convert = TRUE)]
V1 V2
1: 5 5
2: 2 7
3: 8 10
4: 10 20
5: 4 5
-输出
l r
1 5 5
2 2 7
3 8 10
4 10 20
5 4 5
数据
df带scan的基本R选项
> matrix(scan(text = paste0(df$val)), nrow(df), byrow = TRUE)
Read 10 items
[,1] [,2]
[1,] 5 5
[2,] 2 7
[3,] 8 10
[4,] 10 20
[5,] 4 5
或者(感谢@onyanbu的评论)
使用tstrsplit
read.table(text = df$val, header = FALSE, col.names = c('l', 'r'))
> setDT(df)[, tstrsplit(val, " ", type.convert = TRUE)]
V1 V2
1: 5 5
2: 2 7
3: 8 10
4: 10 20
5: 4 5
您还可以使用以下解决方案:
library(tidyr)
df %>% extract(val, c("l", "r"), "(\\d+)\\s(\\d+)")
l r
1 5 5
2 2 7
3 8 10
4 10 20
5 4 5
您也可以使用tidyr::separate
df%separate(val,into=c('l','r'),sep='\\s'))
#>l r
#> 1 5 5
#> 2 2 7
#> 3 8 10
#> 4 10 20
#> 5 4 5
(v2.0.0)于2021-06-03年创建,这里是另一个使用stru-split
的stringr
包的解决方案:
library(stringr)
str_split_fixed(df$val, " ", 2)
输出:
[,1] [,2]
[1,] "5" "5"
[2,] "2" "7"
[3,] "8" "10"
[4,] "10" "20"
[5,] "4" "5"
数据(从AnilGoyal借用):
df您能否将输入共享为dput(df)
?很难在共享时导入带有空格的列。结构(list(val=c(“5 5”、“2 7”、“8 10”、“10 20”、“4 5”)),class=“data.frame”,row.names=c(NA,-5L))read。这里的表非常棒!有一个type.convert
以防Op想要作为数字类型setDT(df)[,tstrsplit(val,“,type.convert=TRUE]
@akrun哦,是的。谢谢你的纠正。如果你使用scan
包括what
参数,那么你就不需要使用as.matrix:list2DF(scan(text=df$val,what=list)(as.numeric(),as.numeric())
@onyanbu是的,没错,谢谢!