尝试使用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方法?
答案 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))