如果列具有匹配的字符串,请将新字符串写入新列

时间:2015-09-07 06:41:47

标签: r

尝试使用A列隔离手机品牌,然后将品牌打印到新品牌Brand。

原件:

   Phone
Samsung note
Samsung note
Nokia lumia
Sony xperia

渴望:

   Phone          Brand
Samsung note 3   Samsung
Samsung note 4   Samsung
Nokia lumia       Nokia
Sony xperia       Sony 

我遇到的问题是:1)我不知道如何创建一个品牌'具有特定字符串的列,其条件是“电话”#39;专栏有一个特定的字符串2)同时为多个品牌做这个,并拥有'品牌'专栏反映出来。

最优雅的方法是什么? 是否有使用mutate的dplyr方法?

2 个答案:

答案 0 :(得分:3)

可以使用base R完成此操作。我们可以使用sub删除“电话”列中的部分子字符串。我们匹配一个或多个空格(\\s+),后跟0个或多个字符(.*),直到字符串的结尾($),并将其替换为''。< / p>

df1$Brand <- sub('\\s+.*$', '', df1$Phone)
df1
#         Phone   Brand
#1 Samsung note Samsung
#2 Samsung note Samsung
#3  Nokia lumia   Nokia
#4  Sony xperia    Sony

或其他选项extract来自library(tidyr)。但是,只有当我们需要将列拆分为多个列时,才会使用extract。在这种情况下,我们保留原始列并仅创建一个新列。

library(tidyr)
extract(df1, Phone, into= 'Brand', '([^ ]+).*', remove=FALSE)
#         Phone   Brand
#1 Samsung note Samsung
#2 Samsung note Samsung
#3  Nokia lumia   Nokia
#4  Sony xperia    Sony

更新:如评论中所述,假设我们有“Samsungnote”或“Nokialumina”等字符串,则根据{之后的最小字符数创建的分组变量,一个选项为split/unsplit {1}}步骤我们使用sub提取字符串的前缀部分substr,然后根据字符数删除每个split元素中的后缀,并list

unsplit

注意:这可能不适用于所有情况。

数据

v1 <-  sub('\\s+.*$', '', df2$Phone)
gr <- substr(v1, 1, min(nchar(v1)))
lst <- split(v1, gr)
df2$Brand <- unsplit(lapply(lst, function(x) substr(x, 1, min(nchar(x)))), gr)
df2
#         Phone   Brand
#1 Samsung note Samsung
#2 Samsung note Samsung
#3  Nokia lumia   Nokia
#4  Sony xperia    Sony
#5  Samsungnote Samsung
#6   Nokialumia   Nokia

答案 1 :(得分:2)

如果您的列电话的每一行都有多个元素,则可以使用包cSplit中的splitstackshape

library(splitstackshape)
cbind(df1, cSplit(df1, 'Phone', sep=' ')[,1, with=F])
#           Phone Phone_1
#1 Samsung note 3 Samsung
#2 Samsung note 4 Samsung
#3    Nokia lumia   Nokia
#4    Sony xperia    Sony

数据:

df1 <- structure(list(Phone = c("Samsung note 3", "Samsung note 4", "Nokia lumia", 
"Sony xperia")), .Names = "Phone", class = "data.frame", row.names = c(NA, -4L))