数据文件名:玩具
假设我有以下数据框
ID Name
1 Green Ball
2 Red Ball
3 Blue Bat
4 Green Bat
5 Blue Ball
6 Ball
7 Bat
我想通过搜索名称中的颜色来添加一个新变量“Color”。
ID Name Color
1 Green Ball Green
2 Red Ball Red
3 Blue Bat Blue
4 Green Bat Green
5 Blue Ball Blue
6 Ball Other
7 Bat Other
我从未使用过R并且不确定如何去做这件事。我试过这个,但没有运气。
toys$Color <- (
if toys$Name = "Green", Color "Green"
else if toys$Name = "Red", Color "Red"
else if toys$Name = "Blue, Color "Blue"
else toys$Name = "Other"
)
我真的很感激这方面的一些帮助。
由于
答案 0 :(得分:3)
我们可以使用str_extract
。创建所有颜色的vector
('col1'),使用str_extract
通过paste
the 'col1' as a single string separated by
获取'name'中与'col1'中的元素匹配的子字符串} | . Replace the
NA`元素输出到'Other'以创建新列'Color'。
library(stringr)
col1 <- c("Green", "Red", "Blue")
v1 <- str_extract(toys$Name, paste(col1, collapse="|"))
v1[is.na(v1)] <- "Other"
toys$Color <- v1
toys
# ID Name Color
#1 1 Green Ball Green
#2 2 Red Ball Red
#3 3 Blue Bat Blue
#4 4 Green Bat Green
#5 5 Blue Ball Blue
#6 6 Ball Other
#7 7 Bat Other
答案 1 :(得分:1)
颜色数量有限,因此您可以创建这些颜色的列表。然后使用您需要安装的包str_detect
中的stringr
。此功能允许您检测字符串中是否存在图案(颜色)。我们使用循环将此函数应用于df
中的每个元素。
df <- as.data.frame(c("Green Ball", "Ball", "Red Ball", "Blue Bat", "White cake", "Deep Purple"))
colnames(df) <- "Items"
colors <- c("Green", "Red", "Blue", "Purple", "Yellow", "White", "Black", "Pink")
library(stringr)
result <- NULL
for (i in 1:NROW(df)){
true.false <- str_detect(as.character(df[i,1]), colors)
col <- ifelse(any(true.false), colors[true.false], "No color")
result <- c(result, col)
}
df$Colors <- result
df
Items Colors
1 Green Ball Green
2 Ball No color
3 Red Ball Red
4 Blue Bat Blue
5 White cake White
6 Deep Purple Purple
<强>替代:强> 您也可以在上述for循环中使用它。
library('stringi')
stri_detect_fixed("Deep Purple", c("Purple", "Blue"))
#[1] TRUE FALSE