我一直在与个人项目的一些代码进行斗争,并且已经遇到了一些roadblocks
。
我有一些餐馆数据,表格中有一列,信息由" /" 分隔。
例如: 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
按表(或多哥)组织,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
其中所有列都是针对特定方面的检查,其中NAs表示缺失值。
数值可以保留为因子,因为每个值都是一个多于整数的因子。理想情况下,"Bob Togo"
也会重命名为"Togo"
,以便所有多哥订单共享相同的因素。
我知道这有点像,但我现在已经遇到了两个多星期的障碍,我觉得我错过了一些简单的事情。
我对R
相对较新,所以非常感谢您对答案的任何补充说明。
答案 0 :(得分:4)
我们可以使用tidyverse
mutate
使用str_replace
进行“检查”列,然后separate
将“检查”分为三列
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
来容纳不同类别的列
注2:tidyverse
是包的集合。因此,在加载时,它会加载来自该捆绑包的所有包。正如@ mt1022建议的那样,我们不需要加载整个tidyverse
,而是可以加载dplyr
(mutate
),tidyr
(separate
)和{ {1}}(stringr
)。
str_replace