R 跨数据帧的计算

R 跨数据帧的计算,r,for-loop,dataframe,lapply,R,For Loop,Dataframe,Lapply,我有两个数据帧列表,第一个dfs保留值列表向下延伸到列,第二个dfs保留单个值,如下所示: dynamic_df_1 <- data.frame(x = 1:10) dynamic_df_2 <- data.frame(y = 1:10) df_list <- list(dynamic_df_1, dynamic_df_2) df_list static_df_1 <- data.frame(mu = 10, stde

我有两个数据帧列表,第一个dfs保留值列表向下延伸到列,第二个dfs保留单个值,如下所示:

dynamic_df_1 <- data.frame(x = 1:10)
dynamic_df_2 <- data.frame(y = 1:10)
df_list <- list(dynamic_df_1, dynamic_df_2)
df_list

static_df_1 <- data.frame(mu = 10,
                          stdev = 5)
static_df_2 <- data.frame(mu = 12,
                          stdev = 6)
static_df_list <- list(stat_df1 = static_df_1, 
                       stat_df2 = static_df_2)
static_df_list

dynamic_df_1此
Map
解决方案似乎更简单。结果是相同的(
)。下面是创建
df_列表2
df_列表3
的代码

df_list4 <- df_list

fun <- function(DF, Static_DF){
  DF[["z"]] = dnorm(DF[[1]], mean = Static_DF[["mu"]], sd = Static_DF[["stdev"]])
  DF
}

df_list4 <- Map(fun, df_list4, static_df_list)


identical(df_list2, df_list3)
#[1] TRUE

identical(df_list2, df_list4)
#[1] TRUE

非常感谢,这是一个功能为@Rui Barradas:)的优雅解决方案。出于好奇,我查看了microbenchmark——对于任何感兴趣的人:
microbenchmark(Map(fun,df_列表4,static_-df_列表),for(I in 1:length(df_列表3)){df_列表3[[I]]$z
#单位:微秒#expr min lq mean中位数uq max neval#Map 41.201 46.7005 71.32204 65.501 81.951 198.601 100#loop 3583.002 4053.2015 4801.83906 4333.851 5067.651 12399.501 100
在计算机上运行时可能会产生显著差异大规模。对格式设置表示歉意。。。
for (i in 1:length(df_list)) {
    df_list[[i]]$z <- dnorm(x = df_list[[i]][[1]], mean = static_df_list[[i]]$mu, sd = static_df_list[[i]]$stdev)
}
df_list
df_list4 <- df_list

fun <- function(DF, Static_DF){
  DF[["z"]] = dnorm(DF[[1]], mean = Static_DF[["mu"]], sd = Static_DF[["stdev"]])
  DF
}

df_list4 <- Map(fun, df_list4, static_df_list)


identical(df_list2, df_list3)
#[1] TRUE

identical(df_list2, df_list4)
#[1] TRUE
df_list2 <- df_list

df_list2[[1]] <- df_list2[[1]] %>%
  mutate(z = dnorm(x = df_list2[[1]]$x, mean = static_df_list$stat_df1$mu, sd = static_df_list$stat_df1$stdev))

df_list2[[2]] <- df_list2[[2]] %>%
  mutate(z = dnorm(x = df_list2[[2]]$y, mean = static_df_list$stat_df2$mu, sd = static_df_list$stat_df2$stdev))


df_list3 <- df_list

for (i in 1:length(df_list3)) {
  df_list3[[i]]$z <- dnorm(x = df_list3[[i]][[1]], mean = static_df_list[[i]]$mu, sd = static_df_list[[i]]$stdev)
}