使用字符串匹配将列添加到小标题

时间:2019-10-02 16:47:00

标签: r

我试图通过匹配另一列中的单词来将新列添加到数据框中。以mtcars为例,我想通过在每个行名中扫描一个字符串来创建一列“国家”。要遍历伪代码的前几行:

if "Mazda" in rowname then "Japan"
if "Datsun" in rowname then "Japan"
if "Hornet" in rowname then "USA"
etc

我尝试将mutate与map函数配合使用,但无济于事。 任何帮助将不胜感激。

3 个答案:

答案 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])])