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
我只想在products
的基础上把APPLE
拆分成三个新的(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})
),然后是另一个元素作为一组,其余元素 (.*
)。在替换中,我们将这些组的反向引用 (\1
)
的大小写更改为小写 (\L
) 或大写 (\U
)
或者更简单的选择是 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
'Dirty' 解决方案,但希望对您有所帮助:)
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
我想根据另一列拆分列。我在下面解释。
这是我的部分数据:
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
我只想在products
的基础上把APPLE
拆分成三个新的(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})
),然后是另一个元素作为一组,其余元素 (.*
)。在替换中,我们将这些组的反向引用 (\1
)
\L
) 或大写 (\U
)
或者更简单的选择是 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
'Dirty' 解决方案,但希望对您有所帮助:)
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