[英]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
中的名稱包含IPHONE6SPlus , IPHONE6S ,則將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"
如果該列同時具有大寫和小寫字符,則可以使用tolower
或toupper
將其轉換為其中之一,然后進行處理
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.