【问题标题】:Recursively building a list of dataframes (in R) - is loop only option?递归地构建数据框列表(在 R 中)- 是循环选项吗?
【发布时间】:2016-01-07 09:05:55
【问题描述】:

我有一个包含 n 列的数据框,我需要获取其变量的组合:

例如:

df <- data.frame(A = c("a1","a2","a3","a4","a5","a6"),
                 B = c("a1","a1","a3","a3","a5","a5"),
                 C = c("a1","a1","a1","a3","a4","a4"),
                 D = c("a1","a1","a1","a3","a4","a5"))

我需要创建一个包含 n-1 个元素的列表,每个元素都包含数据框变量的所有唯一组合。第一个元素包括从第一列到最后一列的唯一值。对于每个后续元素,我需要删除前一个附加数据帧的第一列。像这样:

myList <- list(unique(df[,1:ncol(df)), 
               unique(df[,2:ncol(df)),
               unique(df[,3:ncol(df)))

我设法用 for 循环解决了这个问题:

myList <- list()
for (i in 1:(ncol(df) - 1)){
    myList[[i]] <- unique(df[, i:ncol(df)])
}

但我想知道是否有更快、更优雅的方法来做到这一点。

【问题讨论】:

  • 您可以随时隐藏它。 :) sapply(1:(ncol(df)-1), FUN = function(x, nc, df) df[, x:nc], nc = ncol(df), df = df)
  • 谢谢!有用。小编辑:sapply(1:(ncol(df)-1), FUN = function(x, nc, df) unique(df[, x:nc]), nc = ncol(df), df = df)
  • 将此添加为答案并在宽限期后接受。

标签: r list dataframe


【解决方案1】:

使用 sapply():

sapply(1:(ncol(df)-1), 
       FUN = function(x, nc, df) unique(df[, x:nc]), nc = ncol(df), df = df)

【讨论】:

    【解决方案2】:

    一个优雅的解决方案是递归:

    func = function(df, n, lst)
    {
        if(ncol(df)==n) return(lst)
        func(df, n+1, c(lst, list(unique(df[n:ncol(df)]))))
    }
    
    #> func(df,1, list())
    #[[1]]
    #   A  B  C  D
    #1 a1 a1 a1 a1
    #2 a2 a1 a1 a1
    #3 a3 a3 a1 a1
    #4 a4 a3 a3 a3
    #5 a5 a5 a4 a4
    #6 a6 a5 a4 a5
    
    #[[2]]
    #   B  C  D
    #1 a1 a1 a1
    #3 a3 a1 a1
    #4 a3 a3 a3
    #5 a5 a4 a4
    #6 a5 a4 a5
    
    #[[3]]
    #   C  D
    #1 a1 a1
    #4 a3 a3
    #5 a4 a4
    #6 a4 a5
    

    【讨论】:

      猜你喜欢
      • 2018-02-26
      • 2014-03-31
      • 2018-08-28
      • 2023-03-24
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2019-08-26
      相关资源
      最近更新 更多