在 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)
我一直在为一个个人项目努力编写一些 代码,并且遇到了一些 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)