R根据另一列

时间:2017-04-21 08:45:23

标签: r split data-manipulation

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

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

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

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

我只想根据APPLEproducts分成三个新的(APPLE,iPhone6S,iPhone6)。如果products中的名称包含 IPHONE6SPlus IPHONE6S ,请将brand更改为iPhone6S。如果products中的名称包含 IPhone6 ,请将brand更改为iPhone6。其余的不会改变。

我想我可以使用iflese来做,但products名称中有 size (即16G,64G等)。
如何忽略这些大小并拆分数据。

2 个答案:

答案 0 :(得分:1)

我们可以使用几种方法来做到这一点。这是一个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作为一个组((.))从字符串的开头(^)匹配,然后是另一个元素作为另一个元素group,接下来的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

答案 1 :(得分: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