通过在另一个小标题中查找值来对R小标题进行突变

时间:2018-12-30 22:50:45

标签: r dplyr purrr

在R中处理数据时,我想mutate进行小标题调整,以使新列中的数值以不同的小标题查找。

给出导管移除的数据集:

# A tibble: 51 x 2
   ExplYear RemovalReason
      <dbl> <chr>        
 1     2018 Infection    
 2     2018 Dysfunction  
 3     2018 Infection    
# ... etc.

每行对应于一个导管的拔除,我想添加一列Implants,该列保存了在导管被拔除(_ex_planted)年中_im_plants的总数。

植入编号以impl_per_year开头:

# A tibble: 13 x 2
   ImplYear     n
      <dbl> <int>
 1     2006    14
 2     2007    46
 3     2008    64
# ... etc.

我尝试使用map和一个辅助函数mutate进行第一个小动作:

lookup = function(year) { impl_per_year[impl_per_year$ImplYear == year,]$n }
explants %>% mutate(Implants = map(ExplYear, lookup)

但这会将大量空整数向量放入Implants列:

# A tibble: 51 x 3
   ExplYear RemovalReason Implants
      <dbl> <chr>         <list>     
 1       18 Infection     <int [0]>  
 2       18 Dysfunction   <int [0]>  
 3       18 Infection     <int [0]>  
# ... etc.

怎么了?

2 个答案:

答案 0 :(得分:3)

您应该能够按年份简单地将两个表合并在一起。如果我们使用ExplTibble称呼您的第一个小插曲ImplTibble和第二个dplyr

ExplTibble %>% left_join(ImplTibble, by = c("ExplYear" = "ImplYear"))

这应添加一个新列n,其中包含每年的植入物数量。

答案 1 :(得分:0)

library(tidyverse)

我更改了您的数据,以使我的插图不会显示NULL

df <- tribble(
~ExplYear, ~RemovalReason,
2018, "Infection",   
2017, "Dysfunction",
2016, "Infection")

impl_per_year <- tribble(
  ~ImplYear, ~n,
  2017, 14,
  2016, 46,
  2016, 64
)

left_join是您要寻找的功能。它是dplyr::join函数家族中执行此操作的一部分。

对“连接”变量使用相同的名称是很好的,但是在您的情况下,您需要使用by = c( ... )选项让left_join知道您要通过什么进行连接。

left_join(df, impl_per_year, by = c("ExplYear" = "ImplYear"))

# A tibble: 4 x 3
  ExplYear RemovalReason     n
     <dbl> <chr>         <dbl>
1     2018 Infection        NA
2     2017 Dysfunction      14
3     2016 Infection        46
4     2016 Infection        64

根据需要,考虑使用right_joininner_join等,直到获得所需的输出。例如:

inner_join(df, impl_per_year, by = c("ExplYear" = "ImplYear"))

# A tibble: 3 x 3
  ExplYear RemovalReason     n
     <dbl> <chr>         <dbl>
1     2017 Dysfunction      14
2     2016 Infection        46
3     2016 Infection        64

...这仅给出两个小节的成功匹配。