条件分离变量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