【问题标题】:R with/without dplyr: create new columns as combinations of prev. columns per rowR 带/不带 dplyr:创建新列作为 prev 的组合。每行列数
【发布时间】:2018-06-26 02:01:22
【问题描述】:

假设我有一个这样的数据框:

A B C
1 0 1
0 1 1
1 0 0

我想使用 dplyr(或其他库)生成以下衍生产品:

A B C AB AC BC
1 0 1 0  1  0
0 1 1 0  0  1
1 0 0 0  0  0

所以,我想在数据框中自动创建新列,它们的值将是初始列集的乘积(因此在这种情况下,每行有 3 个乘积 - A*B、A*C 和 B *C)。要点是自动执行此操作(我有 6 列,我无法对所有组合进行编码)。自动创建的列的名称应该有一些命名方案,因为我稍后需要过滤它们。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用combn获取列组合,然后使用for循环创建新列。

    # Create example data frame
    dat <- read.table(text = "A B C
    1 0 1
                      0 1 1
                      1 0 0",
                      header = TRUE)
    
    # Create the column name combination
    m <- combn(names(dat), m = 2)
    
    # Create new columns
    for (i in 1:ncol(m)){
      dat[paste(m[, i], collapse = "")] <- dat[m[1, i]] * dat[m[2, i]]
    }
    
    dat
    #   A B C AB AC BC
    # 1 1 0 1  0  1  0
    # 2 0 1 1  0  0  1
    # 3 1 0 0  0  0  0
    

    【讨论】:

    • 不能利用combnFUN= 参数来获得命名输出总是很痛苦。您可以与combn(dat, 2, FUN=do.call, what=`*`) 如此接近,但还不够。
    • @thelatemail 感谢您分享您的想法。
    • @www,你能解释一下for (i in 1:ncol(m)){ dat[paste(m[, i], collapse = "")] &lt;- dat[m[1, i]] * dat[m[2, i]]的部分吗?
    • @RavinderSingh13 我们使用for循环从1循环到m的列号。对于每一次, dat[paste(m[, i], collapse = "")] 创建一个新列。新列的名称是 paste(m[, i], collapse = ""),类似于ABACBCdat[m[1, i]] * dat[m[2, i]] 是选择和相乘两列的方式。
    【解决方案2】:

    有时最好不要想太多就写代码:

    df <- data.frame(A = c(1, 0, 1), 
                     B = c(0, 1, 0),
                     C = c(1, 1, 0))
    J <- K <- seq_along(df)
    J_n <- K_n <- names(df)
    
    for (j in J) {
      for (k in K) {
        if (j < k) {
          j_name <- J_n[j]
          k_name <- K_n[k]
          df[[paste0(j_name, k_name)]] <- df[[j]] * df[[k]]
        }
      }
    }
    

    这假设新名称不存在于原始数据框中。因此,如果您的原始数据框包含 ABAB 列,这将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 2018-09-26
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多