【问题标题】:R Applying different functions to different data frame columnsR将不同的功能应用于不同的数据框列
【发布时间】:2015-12-15 10:04:32
【问题描述】:

我正在尝试为以下问题开发可重复使用的解决方案。

我将有各种数据框,我希望定义一些基本函数,然后将这些函数应用于数据框中的各个列。结果将是一个与原始数据框具有相同行数和列数的数据框。

我希望这个解决方案是可重复使用的,只要不同的功能组合可以应用于不同的数据帧。

用语言来解释这个有点棘手。我希望下面的代码能让上面的内容更加清晰。

# construct an example data frame
v_a <- c(1, 4, 8, 10, 12)
v_b <- c(4, 6, 7, 4, 3)
v_c <-  c(10, 23, 45, 12, 45)
v_d <- c(12, 45, 7, 10, 5)

df <- data.frame(a = v_a, b = v_b, c = v_c, d = v_d)

# define some example functions
fn_1 <- function(x) x * 3
fn_2 <- function(x) x * 4


# assemble functions into a vector
vct_functions <- c(fn_1, fn_2, fn_1, fn_1)

# apply vector of functions to columns in a data.frame
new_df <- fn_apply_functionList(df, vct_functions)

我希望重用上述解决方案,以便将不同的功能组合应用于相同或不同的数据框。

再一次,下面是一个代码sn-p,以使这一点更清楚。

# create another vector of functions
vct_functionsB <- c(fn_3, fn_4, fn_1, fn_2)

# apply vector of functions to columns in a data.frame
new_df <- fn_apply_functionList(another_df, vct_functions)

任何关于优雅解决方案的想法都将不胜感激。

【问题讨论】:

  • 如果您有 2 个以上相同长度的对象要循环,请使用 Mapmapply - df[] &lt;- Map(function(d,f) f(d), df, vct_functions) 例如。
  • 谢谢。我认为 Map() 解决方案是将两组参数传递给一个函数。我想将 n 个函数的向量应用于 n 个列表。

标签: r function dataframe


【解决方案1】:

@geotheory 差不多了,vct_functionsB 被强制转换为list

试试这个,

do.call(cbind, lapply(1:ncol(df), function(c) vct_functions[[c]](df[, c])))

【讨论】:

    【解决方案2】:

    也许这个..?

    lapply(1:ncol(df), FUN=function(i){vct_functionsB[i](df[,i])})
    

    然后取消列出/解析结果..

    【讨论】:

    • 感谢您的解决方案。我认为它会起作用,但当我尝试它时......我收到以下消息:“FUN(X[[i]],...)中的错误:尝试应用非功能”mmmm??
    • 很确定这是因为vct_functionsB[i] 应该是vct_functionsB[[i]]。检查list(function(x) x)[1](5)list(function(x) x)[[1]](5)
    • 单括号 [] 返回一个列表,而双括号返回单个元素。
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2013-03-04
    • 1970-01-01
    • 2014-12-13
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多