Расчеты по фреймам данных - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть два списка фреймов данных, первый список 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 и dynamic_df_2), используя значения из static_df_1 и static_df_2, чтобы выполнить вычисление, где вычисление для dynamic_df_1 вычисляется со static_df_1, а вычисление для dynamic_df_2 вычисляется со static_df_2.

Результат, к которому я стремлюсь, таков:

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

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

Я могу использовать циклический подход, который мешает более сложным функциям в моем реальном коде:

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

Я пытаюсь найти решение типа lapply / map / mutate, которое вычисляет по всем фреймам данных - представьте сетку фреймов данных, где цель состоит в том, чтобы вычислять по строкам. Также открыты для других решений, таких как одиночный df с вложенными значениями, но еще не выяснили, как это сделать.

Надеюсь, это ясно - я сделал все возможное! Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Это решение Map кажется более простым. И результаты identical(). Код, который создает df_list2 и df_list3, следует ниже.

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_list, запустите конвейер dplyr и код цикла for:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...