在mutate(dplyr)内部逐行应用函数

时间:2019-07-18 11:05:35

标签: string dplyr mutate

我有以下数据,其中Duration记录了每个家庭在同一所房子中的年数。 输入df:

House_ID    Duration
H29937  30 YEAR
H2996   30 YEAR
H156    25 YEAR
H10007  5 MONTH

我正尝试通过以下查询获取以月为单位的持续时间:如果提取的字符串的第二部分是YEAR,则将其乘以12,将持续时间中的数字转换为月。 否则,只取持续时间的数字部分

info_df <- mutate(info_df,
                    residence_Months = ifelse(str_split(Duration," ",2)[[1]][2] == "YEAR",
                                                            as.numeric(str_split(Duration," ",2)[[1]][1])*12,
                                                              as.numeric(str_split(Duration," ",2)[[1]][1])))

预期输出df:

Agent_Code  Duration    Residence_Months
S1299317    30 YEAR     360
S1299622    30 YEAR     360
S1299656    25 YEAR     300
S1300067    5 MONTH     5

但是,上面的代码为所有行提供了与360相同的值。

我不确定错误发生在哪里。有人可以帮我吗?

注意:我已经尝试了其他帖子中指出的按行选项,但无济于事。

1 个答案:

答案 0 :(得分:2)

根据您的完整数据集,使用lubridate包可能会更好地实现,但是考虑到您的示例,您可以执行以下操作:

library(dplyr)
library(tidyr)

df <- tibble(House_ID = c("H29937", "H2996", "H156", "H10007"),
             Duration = c("30 YEAR", "30 YEAR", "25 YEAR", "5 MONTH"))

df %>% 
  separate("Duration", c("duration", "unit")) %>% 
  mutate(duration = as.integer(duration),
         Residence_Months = ifelse(unit == "YEAR", duration * 12, duration))

#> # A tibble: 4 x 4
#>   House_ID duration unit  Residence_Months
#>   <chr>       <int> <chr>            <dbl>
#> 1 H29937         30 YEAR               360
#> 2 H2996          30 YEAR               360
#> 3 H156           25 YEAR               300
#> 4 H10007          5 MONTH                5

reprex package(v0.3.0)于2019-07-18创建