【问题标题】:Expand grid to generate new datasets in R扩展网格以在 R 中生成新数据集
【发布时间】:2020-05-14 04:37:17
【问题描述】:

我有一个数据框,并希望使用 X 组和 Y 组的转换组合从中生成一组新数据集:

#Group X
df1 <- df+1
df2 <- df-2
df3 <- df*3

#Group Y
df4 <- df*4
df5 <- df^5
df6 <- df/6

我真正想做的是使用expand.grid,然后使用 X 组和 Y 组转换的每个组合生成一个新数据集。 (虽然 Y 组总是在 X 组之后应用。)这些数据集应该存储在全局环境中。

所以输出将与结果相同

df14 <- (df+1)*4
df24 <- (df-2)*4
df34 <- (df*3)*4
df15 <- (df+1)^5
df25 <- (df-2)^5
df35 <- (df*3)^5
df16 <- (df+1)/6
df26 <- (df-2)/6
df36 <- (df*3)/6

我该怎么做? (例如,您可以从字面上获取任何数据帧的数据,例如iris。)

如果有帮助,您可以将 X 组和 Y 组转换重写为函数:

#Group X
Fun1 <- function(x){return(x+1)}
Fun2 <- function(x){return(x-2)}
Fun3 <- function(x){return(x*3)}

#Group Y
Fun4 <- function(x){return(x*4)}
Fun5 <- function(x){return(x^5)}
Fun6 <- function(x){return(x/6)}

我想对于数据集的名称,df.Fun1.Fun4 之类的名称会很好。 (注意df 当然应该根据我提供的数据框的名称而改变,所以这里应该是iris.Fun1.Fun4

【问题讨论】:

    标签: r combinations


    【解决方案1】:

    写一个函数来做你想做的事:

    foo = function(add, mult) {
      (df + add) * mult
    }
    

    然后在 addmult 的所需值上使用 expand.grid 并对其进行迭代。 Map 是在基中迭代多个值的好方法。

    params = expand.grid(add = 1:3, mult = 4:6)
    
    df = iris[1:6, 1:3] # numeric sample from iris
    
    result = with(params, Map(foo, add = add, mult = mult))
    names(result) = with(params, paste0("add ", add, ", mult ", mult))
    result
    # $`add 1, mult 4`
    #   Sepal.Length Sepal.Width Petal.Length
    # 1         24.4        18.0          9.6
    # 2         23.6        16.0          9.6
    # 3         22.8        16.8          9.2
    # 4         22.4        16.4         10.0
    # 5         24.0        18.4          9.6
    # 6         25.6        19.6         10.8
    # 
    # $`add 2, mult 4`
    #   Sepal.Length Sepal.Width Petal.Length
    # 1         28.4        22.0         13.6
    # 2         27.6        20.0         13.6
    # 3         26.8        20.8         13.2
    # 4         26.4        20.4         14.0
    # 5         28.0        22.4         13.6
    # 6         29.6        23.6         14.8
    # 
    # $`add 3, mult 4`
    #   Sepal.Length Sepal.Width Petal.Length
    # 1         32.4        26.0         17.6
    # 2         31.6        24.0         17.6
    # ...
    

    适用于函数而非特定参数:

    #Group X
    Fun1 <- function(x){return(x+1)}
    Fun2 <- function(x){return(x-2)}
    Fun3 <- function(x){return(x*3)}
    
    #Group Y
    Fun4 <- function(x){return(x*4)}
    Fun5 <- function(x){return(x^5)}
    Fun6 <- function(x){return(x/6)}
    
    # Put the functions in a list
    funs_x = mget(ls(pattern = "Fun[1-3]"))
    funs_y = mget(ls(pattern = "Fun[4-6]"))
    
    # iterate over list indices
    indices = expand.grid(ind_x = seq_along(funs_x), ind_y = seq_along(funs_y))
    result = with(indices, Map(function(ind_x, ind_y) funs_y[[ind_y]](funs_x[[ind_x]](df)), ind_x, ind_y))
    names(result) = with(indices, paste("df", names(funs_x)[ind_x], names(funs_y)[ind_y], sep = "."))
    result
    # $df.Fun1.Fun4
    #   Sepal.Length Sepal.Width Petal.Length
    # 1         24.4        18.0          9.6
    # 2         23.6        16.0          9.6
    # 3         22.8        16.8          9.2
    # 4         22.4        16.4         10.0
    # 5         24.0        18.4          9.6
    # 6         25.6        19.6         10.8
    # 
    # $df.Fun2.Fun4
    #   Sepal.Length Sepal.Width Petal.Length
    # 1         12.4         6.0         -2.4
    # 2         11.6         4.0         -2.4
    # 3         10.8         4.8         -2.8
    # 4         10.4         4.4         -2.0
    # 5         12.0         6.4         -2.4
    # 6         13.6         7.6         -1.2
    # 
    # $df.Fun3.Fun4
    #   Sepal.Length Sepal.Width Petal.Length
    # 1         61.2        42.0         16.8
    # 2         58.8        36.0         16.8
    # ...
    

    【讨论】:

    • 对不起——以上只是一个玩具示例,这些函数是为了命名并被视为一般转换。更新应该清楚地说明这一点
    • 如果你确实有命名函数,请举一个例子。如果你把你的转换写成function对象,例如x1 = function(x) x + 1; x2 = function(x) x - 2,我们可以用它做点什么。但是,如果您只是有各种转换,已经应用,没有模式,我们无能为力......他们现在解决问题的方式我看不到任何可能性。
    • 我正在寻找答案的想法是我有不同的函数集 - 我可以按名称提供它们,或者将它们完整地写出来,我不介意 - 一组是组X,一组 Y 组。然后我想将它们应用于数据集,首先从 X 组,然后从 Y 组(在每个组合中),每个组合生成一个新数据集。我希望新的更新能反映这一点
    • 谢谢!不错的解决方案!有没有办法让最终数据集的名称直接表达使用的函数和数据集的开始? (例如df.Fun1.Fun5iris.Fun2.Fun6
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2019-03-30
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多