考虑这个简单的例子
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.
我有一个以dataframe
和number
为参数的函数,我想在每次迭代时修改数据框。
我写了以下内容,但它没有更新数据帧:
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.
我在这里缺少什么?谢谢!
答案 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)})