【问题标题】:Build a vector of results using a function and argument as data frame使用函数和参数作为数据框构建结果向量
【发布时间】:2018-03-09 02:56:37
【问题描述】:

如果我有函数,请告知我应该使用哪个函数 (map/lapply/sapply ..):

foo <- function(x, argument1 = "abc", default_score = def_score_dataframe)
returning score

其中x 将是一个数据框,argument1 将在我每次运行该函数时更改,default_score 是一个data.frame,每行包含:namedefault_score

我想要的是使用像map/lapply 这样的单行函数,它将一个值向量分配给argument1,并返回一个包含argument1_ValueScore 列的数据框

换句话说是这样的:

res_df <- lapply(argument_values,
                 foo(x, argument1 = argument_values, default_score = def_score_dataframe))

这应该给我一个结果:

res_df
# argument1_Value Score
#           "aaa"     5

【问题讨论】:

  • 两者,lapply 和 sapply 都是可能的。请参阅lapply(1:10, function(x) x+1)sapply(1:10, function(x) x+1)。如果您需要有关特定功能的帮助,则必须包含代码和可重现的示例。

标签: r function lapply sapply


【解决方案1】:

我会用一个例子来回答你的问题。

您有一个函数对数据框 x、一个向量 (vectorArgument) 和另一个参数(exponent 默认为 2)进行操作

myFun = function(x, vectorArgument, exponent = 2){
  z = (colSums(x) - vectorArgument) ^ exponent
}

如果您将此功能应用于

df = data.frame(A = 1:4, B = 5:8)
d = myFun(df, c(1,22),3)

# You would get:
> d
A   B 
729  64

现在您在另一个数据框中有一组vectorArguments

argumentsDF = data.frame(arg1 = c(1,22), arg2 = c(3,3), arg3 = c(17,21))

为了在 df 和每一列 (margin = 2) 上计算上述函数作为 vectorArgument 参数,请执行以下操作:

result = apply(X = argumentsDF, 
           MARGIN = 2, 
           FUN = function(y){
             myFun(x = df,
                   vectorArgument = y,
                   exponent = 3)
             }
           )

您将获得:

> result
  arg1  arg2 arg3
A  729   343 -343
B   64 12167  125

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多