簡體   English   中英

R根據另一列拆分一列

[英]R split one column based on another

我想基於另一個拆分列。 我在下面解釋。
這是我的數據的一部分:

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來做,但是products名稱中有大小 (即16G,64G等)。
如何忽略這些大小並拆分數據。

我們可以使用兩種方法來做到這一點。 在這里,是一個帶有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

“骯臟”的解決方案,但我希望它能有所幫助:)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM