【问题标题】:Replacing values in a list column using purrr functions使用 purrr 函数替换列表列中的值
【发布时间】:2020-10-28 23:06:30
【问题描述】:

我有一个带有嵌套列表列的数据框,我想通过使用 purrr 包迭代行来根据另一列中的值替换其中一个嵌套列中的值。

我已尝试按照下面的示例使用map2,但我发现该函数正在用向量替换整个列表/嵌套数据框,而不是仅替换目标列。

我想我可能需要使用对 map 的嵌套调用或类似的方法,但我的尝试没有成功。

使用下面的简单示例,对于数据框df3 中的每一行,我想将嵌套data 列中group2 中的所有值替换为group1 中的值,这样@ 中的列987654328@ 保存在df4$data_corrected 中。

df1 <-tibble(class = seq(1:5), group1 = c(rep("a",3),rep("b",2)))
df2 <-tibble(class = rep(1:5, each = 3), group2 = c(rep(c("a","b","b","a","b"),3)),  x = runif(15))

df2 <- nest(df2, data = c(x, group2))

df3 <- left_join(df1, df2, by = "class")

df4 <- df3 %>% mutate(data_corrected = 
                     map2(data, group1, ~  replace(.x$group2, .x$group2 != .y, .y)))

df4$data

df4$data_corrected

我已经使用上述方法成功过滤了行,但它不能转换为替换值。

谢谢!

【问题讨论】:

    标签: r list dataframe replace purrr


    【解决方案1】:

    编辑

    在 cmets 中的 @nickb 建议之后,还有一种更通用的方法来实现预期结果,即保留额外的列和 sf 对象。

    df4 <- df3 %>%    
      mutate(data_corrected = map2(data, group1, ~ {.x %>% mutate(group2 = replace(.x$group2, .x$group2 != .y, .y))}))
    

    输出

    > df4$data
    [[1]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.266 a     
    2 0.372 b     
    3 0.573 b     
    
    [[2]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.908 a     
    2 0.202 b     
    3 0.898 a     
    
    [[3]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.945 b     
    2 0.661 b     
    3 0.629 a     
    
    [[4]]
    # A tibble: 3 x 2
           x group2
       <dbl> <chr> 
    1 0.0618 b     
    2 0.206  a     
    3 0.177  b     
    
    [[5]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.687 b     
    2 0.384 a     
    3 0.770 b 
    
    #####
    
    > df4$data_corrected
    [[1]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.266 a     
    2 0.372 a     
    3 0.573 a     
    
    [[2]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.908 a     
    2 0.202 a     
    3 0.898 a     
    
    [[3]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.945 a     
    2 0.661 a     
    3 0.629 a     
    
    [[4]]
    # A tibble: 3 x 2
           x group2
       <dbl> <chr> 
    1 0.0618 b     
    2 0.206  b     
    3 0.177  b     
    
    [[5]]
    # A tibble: 3 x 2
          x group2
      <dbl> <chr> 
    1 0.687 b     
    2 0.384 b     
    3 0.770 b 
    

    【讨论】:

    • 感谢 Ric,该方法产生了所需的输出。但是,我的简单示例仅包含两列,而实际用例涉及具有大量列的嵌套 sf 对象。你能看到一种无需 cbind 输出中的每一列即可扩展的方法吗?
    • 嗨 Ric,我刚刚做了更多的尝试,处理附加列和 sf 对象的通用方法是:df4 &lt;- df3 %&gt;% mutate(data_corrected = map2(data, group1, ~ {.x %&gt;% mutate(group2 = replace(.x$group2, .x$group2 != .y, .y))}))。我很高兴打勾,但可能值得编辑以进行此更改。非常感谢,尼克。
    • @nickb 当然,更通用的方法总是非常受欢迎!我将根据您的建议编辑我的答案,谢谢
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多