我试图通过匹配另一列中的单词来将新列添加到数据框中。以mtcars为例,我想通过在每个行名中扫描一个字符串来创建一列“国家”。要遍历伪代码的前几行:
if "Mazda" in rowname then "Japan"
if "Datsun" in rowname then "Japan"
if "Hornet" in rowname then "USA"
etc
我尝试将mutate与map函数配合使用,但无济于事。 任何帮助将不胜感激。
答案 0 :(得分:1)
您要使用case_when()
或ifelse()
:
library(dplyr)
mt <- head(mtcars, 5)
mt %>%
mutate(new_col = case_when(
mpg == 21.0 ~ "new",
TRUE ~ "A"
))
mpg cyl disp hp drat wt qsec vs am gear carb new_col
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 new
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 new
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 A
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 A
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 A
答案 1 :(得分:0)
我们可以使用键/值数据集并与原始数据联接,而不是使用多个if/else
或嵌套的ifelse
library(tibble)
library(dplyr
library(stringr)
keyvaldat <- tibble(make = c("Mazda", "Datsun", "Hornet"),
Country = c("Japan", "Japan", "USA"))
rownames_to_column(mtcars, "rn") %>%
mutate(make = word(rn, 1)) %>%
left_join(keyvaldat) %>%
head(4)
# rn mpg cyl disp hp drat wt qsec vs am gear carb make Country
#1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda Japan
#2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Mazda Japan
#3 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Datsun Japan
#4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet USA
注意:如果要更改100个值,则将是100条ifelse
语句。最好是加入
答案 2 :(得分:0)
使用命名矢量(在此示例中为x
)
library(dplyr)
x = c(Mazda = "Japan", Datsun = "Japan", Hornet = "USA")
mtcars %>%
mutate(Make = row.names(.)) %>%
select(Make) %>%
mutate(Country = x[sapply(strsplit(Make, " "), function(x) x[1])])