【问题标题】:add or append a value in a column to the list in another column in data frame将列中的值添加或附加到数据框中另一列的列表中
【发布时间】:2018-09-01 16:17:59
【问题描述】:

这是一个示例数据框

library(tidyverse)
library(purrr)
df <- data_frame(abc = letters[1:3], 
                 lst = list(1:3, 1:3, 1:3), 
                 new_data=1:3)

这将给出结果输出

# A tibble: 3 x 3
    abc       lst new_data
  <chr>    <list>    <int>
1     a <int [3]>        1
2     b <int [3]>        2
3     c <int [3]>        3

我想将new_data 列中的数字附加到lst list-column 中的相应列表中。

这是我到目前为止得到了多少:

df %>%
  mutate(lst= map(lst, ~ append(.,new_data)))

结果是

# A tibble: 3 x 3
    abc       lst new_data
  <chr>    <list>    <int>
1     a <int [6]>        1
2     b <int [6]>        2
3     c <int [6]>        3

我希望第一个列表有1,2,3,1,第二个列表有1,2,3,2,但它们都是1,2,3,1,2,3。在mutate 行中,mutate(lst= map(lst, ~ append(.,new_data)))lst 被视为每行的一个项目,但有些new_data 被视为整列,而不是行中的对应值。

如何只添加单个值?

【问题讨论】:

    标签: r append tidyverse purrr


    【解决方案1】:

    您需要purrr::pmap,它将其功能用作某种“拉链”(类似于R 的基础mapply 和python 的zip)。

    df %>%
      mutate(lst = pmap(list(lst, new_data), ~ append(..1, ..2))) %>%
      str()
    # Classes 'tbl_df', 'tbl' and 'data.frame': 3 obs. of  3 variables:
    #  $ abc     : chr  "a" "b" "c"
    #  $ lst     :List of 3
    #   ..$ : int  1 2 3 1
    #   ..$ : int  1 2 3 2
    #   ..$ : int  1 2 3 3
    #  $ new_data: int  1 2 3
    

    根据 thelatemail 的建议,这里不需要append

    df %>%
      mutate(lst = pmap(list(lst, new_data), c))
    

    【讨论】:

    • 为什么不把df %&gt;% mutate(lst = pmap(list(lst, new_data), c)) 翻译成df$lst &lt;- Map(c, df$lst, df$new_data)?您也可以在那里使用append 而不是c,它仍然可以工作。
    • 太真实了,太晚了,太真实了……我太忙于解决所提出的问题,我忘了看大局。
    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 2020-10-11
    • 2021-02-06
    • 1970-01-01
    • 2022-01-17
    • 2020-11-12
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多