如何在purrr循环中更新数据帧?

时间:2018-03-07 15:02:56

标签: r dplyr purrr tidyeval

考虑这个简单的例子

library(dplyr)
library(purrr)

mydata <- dplyr::data_frame('value' = c(1,2,3))
> mydata
# A tibble: 3 x 1
  value
  <dbl>
1    1.
2    2.
3    3.

我有一个以dataframenumber为参数的函数,我想在每次迭代时修改数据框。

我写了以下内容,但它没有更新数据帧:

  myfunc <- function(df, numba){
  name_var <- paste('year_', quo_name(numba), sep ='')
  df <- df %>% mutate(!!name_var := 1)
  return(df)
}

seq(2006, 2007, by = 1) %>% 
    purrr::walk(function(x) {mydata <- myfunc(mydata, x)})

不幸的是mydata未正确修改:

seq(2006, 2007, by = 1) %>% 
    map(function(x) {mydata <- myfunc(mydata, x)})

给出:

[[1]]
# A tibble: 3 x 2
  value year_2006
  <dbl>     <dbl>
1    1.        1.
2    2.        1.
3    3.        1.

[[2]]
# A tibble: 3 x 2
  value year_2007
  <dbl>     <dbl>
1    1.        1.
2    2.        1.
3    3.        1.

而预期的输出应为

# A tibble: 3 x 3
  value year_2006 year_2007
  <dbl>     <dbl>     <dbl>
1    1.        1.        1.
2    2.        1.        1.
3    3.        1.        1.

我在这里缺少什么?谢谢!

2 个答案:

答案 0 :(得分:1)

firstarray以列表形式返回结果。您可以使用map按列绑定每年的结果,然后删除额外的map_dfc

value

答案 1 :(得分:-1)

首先,应该mydata <- data.frame('value' = c(1,2,3)),而不是mydata <- data_frame('value' = c(1,2,3))。现在,要解决您的问题,您应该返回数据框以进行修改。像这样:

myfunc <- function(df, numba){
    name_var <- paste('year_', quo_name(numba), sep ='')
    df <- df %>% mutate(name_var = 1)
    return(df)
}

修改

尝试使用

seq(2006, 2007, by = 1) %>% 
 map(function(x) {mydata <- myfunc(mydata, x)})