条件分离变量dplyr

条件分离变量dplyr,r,dplyr,tidyr,R,Dplyr,Tidyr,考虑我正在处理的一个非常混乱的数据集的最小工作示例: library(dplyr) library(tidyr) x<- paste(sort(rep(LETTERS[1:4], 3)), paste0(rep("#", 3), rep(11:13, 3))) y<- paste(sort(rep(LETTERS[1:4], 2)), paste0(rep(1:2, 2), rep("/0", 2))) data<- data.frame(Item = c(x, y)) 我

考虑我正在处理的一个非常混乱的数据集的最小工作示例:

library(dplyr)
library(tidyr)

x<- paste(sort(rep(LETTERS[1:4], 3)), paste0(rep("#", 3), rep(11:13, 3)))
y<- paste(sort(rep(LETTERS[1:4], 2)), paste0(rep(1:2, 2), rep("/0", 2)))
data<- data.frame(Item = c(x, y))
我想把这个项目分为项目和大小。有两种尺寸。第一个,11:13,由。第二个是1/0:2/0,在本例中可以用/0标识。要将第一个大小类型与项目数据分离,请使用%>%separateItem,into=cItem,size,sep=。但是,这会在第13:20行中输出NA

如何根据条件分离变量,以便第二种尺寸类型的项目和尺寸可以分离

我尝试了下面的代码,但没有成功

data %>% 
        separate(Item, into = c("Item", "Size"), sep = "#") %>% 
        mutate(ifelse(grepl("/0", Item) == TRUE, separate(Item, into = c("Item", "Size"), sep = " (?=[^ ]+$)", perl=TRUE), Size))
编辑

所需的输出应如下所示:

   Item Size
1     A   11
2     A   12
3     A   13
4     B   11
5     B   12
6     B   13
7     C   11
8     C   12
9     C   13
10    D   11
11    D   12
12    D   13
13    A  1/0
14    A  2/0
15    B  1/0
16    B  2/0
17    C  1/0
18    C  2/0
19    D  1/0
20    D  2/0

我想这可能就是你想要的。在空格上拆分,然后将or/0替换为空白,除非我误解了

data %>%
  separate(Item, into = c("Item", "Size"), sep = " ") %>%
  mutate(Size = gsub("/0|#", "", Size))

要回答您的问题,|运算符允许您选择多个分隔符

data %>% 
  separate(Item, into = c("Item", "Size"), sep = " #| ")
或者,您可以使用公共字符分割所有内容,然后在以下操作之后清理列:

data %>% 
      separate(Item, into = c("Item", "Size"), sep = " ")
有关帮助清洁的更多正则表达式信息,请参阅。如果它是不整洁的文本,你会喜欢并且需要stringR,因为大小在空白后有图案或数字,这将转到sep参数

?=[0-9]查找模式,如1 [0-9]查找模式,如1 |手段或 总之,假设这些类型的模式不会出现在项目名称中


行13:20的大小应该是什么样的?您是否尝试过data%>%separateItem,into=cItem,Size,sep=为什么需要分开?你不能使用gsub删除项目中的字母,只留下适当的数字吗?正如@divibisan所问的,你想从1/0中保留什么?A和1?运行另一个命令可以吗?这很简单,还是全部在一行中?我已经编辑了这个问题,以提供所需的输出。我理解,对于这个示例,项目和大小可以按照@Kerry Jackson用空格分隔。然而,在原始数据集中,我在分离前处理项中更混乱的字符串。项目描述的长度为一到五个单词,大小不一定总是在字符串的末尾。因此,我想知道变量是否可以通过ifelse函数或其他函数有条件地分离。运行另一个或多个命令很好@Sahir MoosviThird选项是separateItem,into=cItem,Size,sep=?
data %>% 
      separate(Item, into = c("Item", "Size"), sep = " ")
library(tidyverse)
x <- paste(sort(rep(LETTERS[1:4], 3)), paste0(rep("#", 3), rep(11:13, 3)))
y <- paste(sort(rep(LETTERS[1:4], 2)), paste0(rep(1:2, 2), rep("/0", 2)))
mydf <- data_frame(Item = c(x, y))
#---------------------------------
mydf %>% 
  separate(Item, into = c("Item", "Size"), sep = " #(?=[0-9])| (?=[0-9])")
#> # A tibble: 20 x 2
#>    Item  Size 
#>    <chr> <chr>
#>  1 A     11   
#>  2 A     12   
#>  3 A     13   
#>  4 B     11   
#>  5 B     12   
#>  6 B     13   
#>  7 C     11   
#>  8 C     12   
#>  9 C     13   
#> 10 D     11   
#> 11 D     12   
#> 12 D     13   
#> 13 A     1/0  
#> 14 A     2/0  
#> 15 B     1/0  
#> 16 B     2/0  
#> 17 C     1/0  
#> 18 C     2/0  
#> 19 D     1/0  
#> 20 D     2/0