在 R 中的数据框列上应用函数,编译结果

Apply function over columns of dataframe in R, compile results

我在这里和 Google 上搜索过,但没有找到适合我的情况的答案。

假设我有一个包含元素 1、元素 2、元素 3、公制和其他列的数据框。我有另一个具有三个参数(input_dataframe、element_position、metric_position)的内部函数,我用它来一次计算一个元素。它输出一个数据框,假设 1 行由三个变量组成。

我一直在尝试使用 lapply 或 for 循环编写代码,允许我指定包含元素的列范围(在上面的示例中,它是数据框的第 1-3 列) 和 运行 针对指标列的所有指定列的函数,然后将结果合并为一个 table,其中包含每个 运行 函数的结果。我没有运气使这项工作尝试 lapply 的变体和 seq_along 的循环。有什么建议么?下面是我当前低效解决方案的示例数据、代码和输出:

#example data
element1 <- c("control", "control", "variation", "variation")
element2 <- c("control", "variation", "variation", "control")
element3 <- c("variation", "control", "variation", "variation")
metric <- c(10,15,20,25)
other <- c(2,4,2,6)
data<-data.frame(element1, element2, element3, metric, other)

#example function
test_func <- function(input_df,element_position,metric_position)
{
  df <- input_df[,c(element_position,metric_position)]
  colnames(df) <- c("element","metric")
  mean <- ddply(df,~element,summarise,mean(metric))
  control <- mean[1,2]
  variation <- mean[2,2]
  lift <- (variation-control)/control
  df_table <<- data.frame(control,variation,lift)
}

#call function three times, once for each element, compile results
test_func(data,1,4)
element1 <- df_table
test_func(data,2,4)
element2 <- df_table
test_func(data,3,4)
element3 <- df_table
summary_output <- rbind(element1,element2,element3)

我对你的功能做了一些小改动。您应该只 return 对象并保存函数的结果而不是使用 <<-

#example data
element1 <- c("control", "control", "variation", "variation")
element2 <- c("control", "variation", "variation", "control")
element3 <- c("variation", "control", "variation", "variation")
metric <- c(10,15,20,25)
other <- c(2,4,2,6)
data<-data.frame(element1, element2, element3, metric, other)

#example function
test_func <- function(input_df,element_position,metric_position)
{
  require('plyr')
  df <- input_df[,c(element_position,metric_position)]
  colnames(df) <- c("element","metric")
  mean <- ddply(df,~element,summarise,mean(metric))
  control <- mean[1,2]
  variation <- mean[2,2]
  lift <- (variation-control)/control
  data.frame(control,variation,lift)
}

这只会将每组参数映射到 test_func:

  1. data, element_position = 1, metric_position = 4
  2. data, element_position = 2, metric_position = 4
  3. data, element_position = 3, metric_position = 4

等等

do.call('rbind', Map(test_func, rep(list(data), 3), 1:3, rep(4, 3)))

#   control variation      lift
# 1    12.5  22.50000 0.8000000
# 2    17.5  17.50000 0.0000000
# 3    15.0  18.33333 0.2222222

df_table <<- data.frame(control,variation,lift) 部分有错别字,运算符 <<- 执行全局赋值而不是局部函数环境,因此最新值会覆盖以前的值。编辑拼写错误并使用 lapply 和 rbind 给出您预期的结果。

test_func_modif <- function(input_df,element_position,metric_position)
{
  df <- input_df[,c(element_position,metric_position)]
  colnames(df) <- c("element","metric")
  mean <- ddply(df,~element,summarise,mean(metric))
  control <- mean[1,2]
  variation <- mean[2,2]
  lift <- (variation-control)/control
  df_table <- data.frame(control,variation,lift)
}




element_vec  = 1:3
metric_position_value = 4
result_list = lapply(element_vec,function(x) test_func_modif(data,x,metric_position_value))
result_DF = do.call(rbind,result_list)
# > result_DF
#   control variation      lift
# 1    12.5  22.50000 0.8000000
# 2    17.5  17.50000 0.0000000
# 3    15.0  18.33333 0.2222222
# > all.equal(summary_output,result_DF)
# [1] TRUE