R 如何使用空格将列一分为二

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之间的空白将其拆分为两列[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  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是的,没错,谢谢!