我想尝试一种朋友建议的归一化方法,首先从第一个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方法(出于熟悉),但是任何可行的解决方案都可以。
非常感谢您的帮助!
塞巴斯蒂安
答案 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])
这似乎与您自己对问题的回答中所提议的有所不同...