在 R 中将 1 列拆分为 1 到 3 列

Splitting 1 column into 1 to 3 columns in R

我一直在为一个个人项目努力编写一些 代码,并且遇到了一些 roadblocks

我有一些餐厅数据,table 有一个列,信息由 "/" 分隔。

例如: 4/1 means table 4, and first check at that table for the day. 10/A/2 means Table 10, the check was split into 2 or more checks (A, B, C, etc) and this is check 10/A, and turnover 2.

支票也可以是多哥订单,可以用订单名称表示。

例如,这里有一些可能的订单:

1/1
1/2
10/A/3
10/B/3
多哥
鲍勃多哥

我想将它们分成 1 to 3 columns,由 table(或多哥)组织,split, and turnover. 像这样:

> check <- c("1/1", "1/2", "10/A/3", "10/B/3", "Togo", "Bob Togo")
> checknum <- seq(1:6)
> dat <- cbind(checknum,check)
> dat
     checknum check     
[1,] "1"      "1/1"     
[2,] "2"      "1/2"     
[3,] "3"      "10/A/3"  
[4,] "4"      "10/B/3"  
[5,] "5"      "Togo"    
[6,] "6"      "Bob Togo"

理想情况下,我希望它们看起来像这样:

> Table <- c(1,1,10,10,"Togo","Bob Togo")
> Split <- c(NA,NA,"A","B",NA,NA)
> Turn <- c(1,2,3,3,NA,NA)
> Ideal <- cbind(checknum,Table,Split,Turn)
> Ideal
     checknum Table      Split Turn
[1,] "1"      "1"        NA    "1" 
[2,] "2"      "1"        NA    "2" 
[3,] "3"      "10"       "A"   "3" 
[4,] "4"      "10"       "B"   "3" 
[5,] "5"      "Togo"     NA    NA  
[6,] "6"      "Bob Togo" NA    NA 

其中所有列都用于使用 NA 检查缺失值的特定方面。

数值可以保留为因子,因为每个数值都比整数更能充当因子。理想情况下,"Bob Togo" 也将重命名为 "Togo",以便所有多哥订单共享相同的因子。

我知道这有点突然,但我已经遇到障碍 2 个多星期了,我觉得我缺少一些简单的东西。

我对 R 比较陌生,因此非常感谢您对答案的任何补充解释。

我们可以通过 mutate 将 'check' 列使用 str_replace 然后 separate 将 'check' 分为三个列

library(tidyverse)
dat %>%
   mutate(check = str_replace(check, "^(\d+)/(\d+)$", "\1/NA/\2"))  %>%
   separate( check, into = c("Table", "Split", "Turn"), sep="/", convert = TRUE)
#   checknum    Table Split Turn
#1        1        1    NA    1
#2        2        1    NA    2
#3        3       10     A    3
#4        4       10     B    3
#5        5     Togo  <NA> <NA>
#6        6 Bob Togo  <NA> <NA>

注意 1:最好创建一个 data.frame 作为初始数据集而不是 matrix 以容纳不同的 class 列

注2:tidyverse是包的集合。因此,在加载时,它会加载来自该包的所有包。正如@mt1022 建议的那样,我们不需要加载整个 tidyverse,而是可以加载 dplyr (mutate)、tidyr (separate) 和 stringr (str_replace).

数据

dat <- data.frame(checknum,check, stringsAsFactors=FALSE)