【问题标题】:Subtract each col in a df from every other col从其他每一列中减去 df 中的每一列
【发布时间】:2020-05-16 06:37:27
【问题描述】:

我想尝试一个朋友推荐的标准化方法,其中应该减去 df 的每个 col,首先从第一个 col 中减去,然后从该 df 的每个其他 col 中减去。

例如:

df <- data.frame(replicate(9,1:4))

x_df_1 <- df[,1] - df[2:ncol(df)]
x_df_2 <- df[,2] - df[c(1, 3:ncol(df))]
x_df_3 <- df[,3] - df[c(1:2, 4:ncol(df))]
...
x_cd_ncol(df) <- df[c(1: (1-ncol(df)))]

由于 df 有 90 列,因此手动执行此操作会很糟糕(而且编码非常糟糕)。我确信必须有一种优雅的方法来解决这个问题并在最后收到一个包含所有 dfs 的列表,但我完全不知道如何到达那里。我会很感激 dplyr 方法(为了熟悉),但任何可行的解决方案都可以。

非常感谢您的帮助!

塞巴斯蒂安

【问题讨论】:

    标签: r


    【解决方案1】:

    我可能已经找到了我在这里分享的解决方案。 如果我错了,请纠正我。

    这是一个没有替换的排列任务。 原始 df 有 90 列。

    让我们首先检查有多少种可能的组合: (来自:https://davetang.org/muse/2013/09/09/combinations-and-permutations-in-r/

    comb_with_replacement <- function(n, r){
      return( factorial(n + r - 1) / (factorial(r) * factorial(n - 1)) )
    }
    
    
    comb_with_replacement(90,2) #4095 combinations
    

    现在使用此处修改的答案:https://stackoverflow.com/a/16921442/10342689

    (df 有 90 列。不知道如何创建这个正确的示例 df。)

    cc_90 <- combn(colnames(df), 90)
    result <- apply(cc_90, 2, function(x) df[[x[1]]]-df[[x[2]]])
    
    dim(result) #4095
    

    应该可以的。

    【讨论】:

      【解决方案2】:

      在 R 中,可以使用负索引来表示“除此索引之外的所有内容”。
      所以我们可以重写你的第一行规范化:

      x_df_1 <- df[,1] - df[2:ncol(df)]
      # rewrite as:
      x_df_1 <- df[,1] - df[,-1]
      

      从这里开始,下一步很容易编写一个循环来生成您“手动”生成的 90 个新数据帧:

      list_of_dfs=lapply(seq_len(ncol(df)),function(x) df[,x]-df[,-x])
      

      这似乎与您在自己对问题的回答中提出的内容有些不同...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 2018-08-12
        • 2020-01-25
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        相关资源
        最近更新 更多