我有一个数据帧列表,可以单独操作,如下所示:
df_list <- list(A1 = data.frame(v1 = 1:10,
v2 = 11:20),
A2 = data.frame(v1 = 21:30,
v2 = 31:40))
df_list
使用lapply
使我可以在像这样的数据帧列表上运行一个函数:
library(tidyverse)
some_func <- function(lizt, comp = 2){
lizt <- lapply(lizt, function(x){
x <- x %>%
mutate(IMPORTANT_v3 = v2 + comp)
return(x)
})
}
df_list_1 <- some_func(df_list)
df_list_1
到目前为止很好,但是我需要使用不同的参数多次运行该函数,因此使用mapply
返回:
df_list_2 <- mapply(some_func,
comp = c(2, 3, 4),
MoreArgs = list(
lizt = df_list
),
SIMPLIFY = F
)
df_list_2
这将为馈给mapply
中的函数的每个参数创建一个新的数据帧列表,从而为我提供3个2个数据帧列表。很好,但是我要寻找的输出是为mapply中的每个参数在每个原始数据帧上添加一个新列,如下所示:
desired_df_list <- list(A1 = data.frame(v1 = 1:10,
v2 = 11:20,
IMPORTANT_v3 = 13:22,
IMPORTANT_v4 = 14:23,
IMPORTANT_v5 = 15:24),
A2 = data.frame(v1 = 21:30,
v2 = 31:40,
IMPORTANT_v3 = 33:42,
IMPORTANT_v4 = 34:43,
IMPORTANT_v5 = 35:44))
desired_df_list
我如何纠缠数据框列表列表的输出,以仅将所需的新列(IMPORTANT_v3
)隔离并附加到原始数据框?还可以打开其他选项,例如使用lapply
来更改mapply
中的多列,但我还没有弄清楚如何编写代码。谢谢!
已解决:
main_func <- function(lizt, comp = c(2:4)){
lizt <- lapply(lizt, function(x){
df <- mapply(movavg,
n = comp,
type = "w",
MoreArgs = list(x$v2),
SIMPLIFY = T
)
colnames(df) <- paste0("IMPORTANT_v", 1:ncol(df))
print(df)
print(x)
x <- cbind(x, df)
return(x)
})
}
desired_df_list_complete <- main_func(df_list)
desired_df_list_complete
在此示例中,使用movavg
包中的pracma
。