如何使用空格将一列分成两列

3
我有以下输入数据框。我需要根据它们之间的空格将此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

你能分享一下 dput(df) 的输入吗?因为你分享的带有空格的列很难导入。 - Gregor Thomas
结构(列表)(值= c(“5 5”,“2 7”,“8 10”,“10 20”,“4 5”),类=“数据框”,行名= c(NA,-5L)) - Chennai Cheetah
5个回答

4
使用base R更容易,通过使用read.table读取列'val',它会自动在空格处分割该列。只需指定列名(如果需要),否则它将创建默认名称。优势是如果使用strsplit手动更改时,read.table会自动更改。
read.table(text = df$val, header = FALSE, col.names = c('l', 'r'))

-输出

 l  r
1  5  5
2  2  7
3  8 10
4 10 20
5  4  5

数据

df <- structure(list(val = c("5 5", "2 7", "8 10", "10 20", "4 5")), 
      class = "data.frame", row.names = c(NA, -5L))

4

使用 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

或者(感谢@Onyambu的评论)
> list2DF(scan(text = df$val, what = list(as.numeric(), as.numeric())))
Read 5 records
       
1  5  5
2  2  7
3  8 10
4 10 20
5  4  5

使用 tstrsplitdata.table 选项
> setDT(df)[, tstrsplit(val, " ", type.convert = TRUE)]
   V1 V2
1:  5  5
2:  2  7
3:  8 10
4: 10 20
5:  4  5

如果用户想要数值类型,可以使用 type.convert。代码如下:setDT(df)[, tstrsplit(val, " ", type.convert = TRUE] - akrun
1
@akrun 哦,是的。谢谢你纠正我。 - ThomasIsCoding
2
如果您使用scan函数,请包含what参数,这样您就不需要使用as.matrix函数:list2DF(scan(text=df$val, what=list(as.numeric(), as.numeric()))) - Onyambu

4
您还可以使用以下解决方案:
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

3

你也可以使用tidyr::separate

df <- read.table(text = "    val
1   '5 5'
2   '2 7'
3  '8 10'
4 '10 20'
5   '4 5'", header = T)
library(tidyr)
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

这是2021年6月3日用reprex包(v2.0.0)创建的


2

这里有另一种使用 stringr 包中的 str_split 的解决方案:

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 <- read.table(text = "    val
1   '5 5'
2   '2 7'
3  '8 10'
4 '10 20'
5   '4 5'", header = T)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接