【问题标题】:expand.grid with separate variable for each columnexpand.grid 每列都有单独的变量
【发布时间】:2015-01-10 21:39:28
【问题描述】:

我想在 R 中实现以下data.frame

    i1   i2   i3
1   A1   A2   A3
2   No   A2   A3
3   A1   No   A3
4   No   No   A3
5   A1   A2   No
6   No   A2   No
7   A1   No   No
8   No   No   No

在每一列中,变量可以是串联的字符串"A" 和列号,也可以是"No"data.frame 应该包含所有可能的组合。

我的想法是使用expand.grid,但我不知道如何动态创建list。还是有更好的方法?

expand.grid(list(c("A1", "No"), c("A2", "No"), c("A3", "No")))

【问题讨论】:

    标签: r combinations


    【解决方案1】:

    我猜你可以创建自己的辅助函数,类似的东西

    MyList <- function(n) expand.grid(lapply(paste0("A", seq_len(n)), c, "No"))
    

    然后简单地传递元素的数量(例如,3)

    MyList(3)
    #   Var1 Var2 Var3
    # 1   A1   A2   A3
    # 2   No   A2   A3
    # 3   A1   No   A3
    # 4   No   No   A3
    # 5   A1   A2   No
    # 6   No   A2   No
    # 7   A1   No   No
    # 8   No   No   No
    

    或者,您也可以尝试 data.tables CJ 等效项,这对于大 n 来说应该比 expand.grid 更有效

    library(data.table)
    DTCJ <- function(n) do.call(CJ, lapply(paste0("A", seq_len(n)), c, "No"))
    DTCJ(3) # will return a sorted cross join
    #    V1 V2 V3
    # 1: A1 A2 A3
    # 2: A1 A2 No
    # 3: A1 No A3
    # 4: A1 No No
    # 5: No A2 A3
    # 6: No A2 No
    # 7: No No A3
    # 8: No No No
    

    【讨论】:

    • @Ananda,不幸的是CJ 不适用于列表对象,我正要问 Arun。也许 akruns data.frame 会起作用,不知道
    【解决方案2】:

    另一种选择是使用Mapexpand.grid

     n <- 3
     expand.grid(Map(c, paste0('A', seq_len(n)), 'NO'))
    

    或者

     expand.grid(as.data.frame(rbind(paste0('A', seq_len(n)),'NO')))
    

    【讨论】:

      【解决方案3】:

      另一种选择,仅使用 R 中最基本的函数,是使用索引:

      df <- data.frame(V1 = c('A','A','A', 'A',rep('No',4)), V2 = c('A','A','No','No','A','A','No','No'), V3 = c('A','No','A','No','A','No','A','No'), stringsAsFactors = FALSE)
      

      获取我们需要更改的元素的行和列索引:

      rindex <- which(df != 'No') %% nrow(df)
      cindex <- ceiling(which(df != 'No')/nrow(df))
      

      解决方案基本上是单行的:

      df[matrix(c(rindex,cindex),ncol=2)] <- paste0(df[matrix(c(rindex,cindex),ncol=2)],cindex)
      
      > df
      
        V1 V2 V3
      1 A1 A2 A3
      2 A1 A2 No
      3 A1 No A3
      4 A1 No No
      5 No A2 A3
      6 No A2 No
      7 No No A3
      8 No No No
      

      【讨论】:

      • 你指的是什么df? OP 没有提供数据集。我猜他们实际上试图避免创建一个。
      • @DavidArenburg,请参阅我的编辑。我构建了 OP 在寻求解决方案时使用的 df。
      • 抱歉,我在任何地方都没有看到这个df。提供的所有 OP 都是他想要的输出。
      • @DavidArenburg,你是对的,但你可以从他的问题中推断出一个可能的 df: > 在每一列中,变量可以是串联的字符串“A”和列号,也可以是“否”。 data.frame 应该包含所有可能的组合。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 2014-11-03
      • 1970-01-01
      • 2013-10-29
      • 2020-11-03
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多