2017-04-21 100 views
2

我想根据另一列拆分列。我在下面解释。
这里是我的部分数据:R根据另一列拆分一列

brand products 
APPLE IPHONE6SPlus_16G 
APPLE IPHONE6S_64G 
APPLE IPHONE6S_16G 
APPLE IPhone6_32G 
APPLE iPadAir2_64G 
APPLE iPadmini2_16G 
APPLE iPadmini4_64G 
HTC  ONEX 
Samsung SamsungGalaxy 

我想根据Products分裂brand。这是我真正想要的。

brand  products 
iPhone6S IPHONE6SPlus_16G 
iPhone6S IPHONE6S_64G 
iPhone6S IPHONE6S_16G 
iPhone6  IPhone6_32G 
APPLE  iPadAir2_64G 
APPLE  iPadmini2_16G 
APPLE  iPadmini4_64G 
HTC   ONEX 
Samsung  SamsungGalaxy 

我只是想APPLE分成基于products三个新(APPLE,iPhone6S,iPhone6)。如果products中的名称包含IPHONE6SPlusIPHONE6S,请将brand更改为iPhone6S。如果products中的名称包含IPhone6,请将brand更改为iPhone6。其余的不变。

我想我可以用iflese来做,但的大小为(即16G,64G等)在products这个名字。
如何忽略这些大小并拆分数据。

+1

你可以使用'grepl'来匹配模式,即''df1 $ brand [grepl(“IPHONE6S”,df1 $ products)] < - “IPHONE6S”' – akrun

+0

目前还不清楚您是否只有一种模式。试试'v1 < - sub(“^(。)(。)(。{5})(。)。*”,“\\ L \\ 1 \\ U \\ 2 \\ L \\ 3 \\ U \\ 4“,df1 $ products,perl = TRUE); df1 $ brand [v1 ==”iPhone6S“] < - v1 [v1 ==”iPhone6S“]' – akrun

+1

您能否解释'v1 < - sub(”^( (。)(。{5})(。)。*“,”\\ L \\ 1 \\ U \\ 2 \\ L \\ 3 \\ U \\ 4“”,df1 $ products, perl = TRUE)'。谢谢 –

回答

2

我们可以使用一些方法来做到这一点。在此,是一个与sub==

v1 <- sub("^(.)(.)(.{5})(.).*", "\\L\\1\\U\\2\\L\\3\\U\\4", df1$products, perl = TRUE) 
df1$brand[v1=="iPhone6S"] <- v1[v1 == "iPhone6S"] 
df1 
#  brand   products 
#1 iPhone6S IPHONE6SPlus_16G 
#2 iPhone6S  IPHONE6S_64G 
#3 iPhone6S  IPHONE6S_16G 
#4 APPLE  IPhone6_32G 
#5 APPLE  iPadAir2_64G 
#6 APPLE iPadmini2_16G 
#7 APPLE iPadmini4_64G 
#8  HTC    ONEX 
#9 Samsung SamsungGalaxy 

sub匹配第一元件捕获从字符串(^)的开始的基团((.)),接着下一个元素作为另一基团的pattern,下一个5元素作为第三组((.{5})),接着是另一个元素作为一个组和其余元素(.*)。在替换中,我们要么改变的情况下,以降低(\\L)或上部(\\U)为那些基团的反向引用(\\1


或更容易的选择是与grepl

df1$brand[grepl("IPHONE6S", df1$products)] <- "iPhone6S" 

如果列中同时包含大小写字符,则可以使用tolowertoupper将其转换为其中一个,然后执行处理

df1$brand[grepl("IPHONE6S", toupper(df1$products))] <- "iPhone6S" 

假设我们想改变多个元素,这可以通过循环

nm1 <- c("IPAD", "IPHONE", "SAMSUNG") 
for(j in nm1) df1$brand[grepl(j, toupper(df1$products))] <- j 
df1 
# brand   products 
#1 IPHONE IPHONE6SPlus_16G 
#2 IPHONE  IPHONE6S_64G 
#3 IPHONE  IPHONE6S_16G 
#4 IPHONE  IPhone6_32G 
#5 IPAD  iPadAir2_64G 
#6 IPAD iPadmini2_16G 
#7 IPAD iPadmini4_64G 
#8  HTC    ONEX 
#9 SAMSUNG SamsungGalaxy 
+0

我可以忽略“产品”中的字母大写和小写字母吗?另外,我可以igonre空间(如:iPhone 6)? –

+0

@PeterChen我不明白你的问题。例如,'IPHONE6SPlus_16G',假设我们忽略大写和小写字母,那么只有6,16和'_'仍然是 – akrun

+1

例如,** IPHONE6SPlus **和** iphone6splus **是相同的 –

1

'脏' 的解决方案来实现,但我希望它能帮助:)

x <- c('IPHONE6SPlus','IPHONE6S') 
b$new <- grepl(paste(x, collapse = "|"), b$products) 
b$brand[b$new==TRUE] <- "Iphone6S" 
b$new <- NULL 
y <- c('IPhone6') 
b$new <- grepl(paste(y, collapse = "|"), b$products) 
b$brand[b$new==TRUE] <- "Iphone6" 
b$new <- NULL 

    brand   products 
1 Iphone6S IPHONE6SPlus_16G 
2 Iphone6S  IPHONE6S_64G 
3 Iphone6S  IPHONE6S_16G 
4 Iphone6  IPhone6_32G 
5 APPLE  iPadAir2_64G 
6 APPLE iPadmini2_16G 
7 APPLE iPadmini4_64G 
8  HTC    ONEX 
9 Samsung SamsungGalaxy