在R

时间:2017-04-15 05:25:47

标签: r rstudio

我一直在与个人项目的一些代码进行斗争,并且已经遇到了一些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相对较新,所以非常感谢您对答案的任何补充说明。

1 个答案:

答案 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,而是可以加载dplyrmutate),tidyrseparate)和{ {1}}(stringr)。

数据

str_replace