从其他col中减去df中的每个col

时间:2020-05-15 16:36:29

标签: r

我想尝试一种朋友建议的归一化方法,首先从第一个col中减去一个df的每个col,然后从该df中的其他所有col减去它。

例如:

#SQL Connect
conn = sqlite3.connect(r'C:\Users\User\Downloads\SQL\File.db')
c = conn.cursor()
conn.commit()

Dados.to_sql('Database', conn, index=False, if_exists='append')

sqlite3.OperationalError: table "Database" already exists

由于df有90个cols,因此手动执行操作会很糟糕(而且编码很差)。我确信必须有一种优雅的方法来解决这个问题,并在最后接收包含所有df的列表,但是我完全迷住了如何到达那里。我希望使用dplyr方法(出于熟悉),但是任何可行的解决方案都可以。

非常感谢您的帮助!

塞巴斯蒂安

2 个答案:

答案 0 :(得分:0)

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

这是没有替换任务的排列。 原始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个cols。在这里不知道如何创建此属性作为示例df。)

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

dim(result) #4095

应该可以。

答案 1 :(得分:0)

在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])

这似乎与您自己对问题的回答中所提议的有所不同...

相关问题