首页 > 解决方案 > 相互减去多列

问题描述

我有一个大型数据集,我想根据它们的位置相互减去特定的列。我想从第 8 列中减去第 2 列,从第 9 列中减去第 3 列,从第 10 列中减去第 4 列。

非常感谢

马格努斯

structure(list(Stamp_summertime = structure(c(1546684744, 1546685858, 
                                              1546687004, 1547030061, 1547030835, 1547031816), tzone = "UTC", class = c("POSIXct", 
                                                                                                                        "POSIXt")), X26.013 = c(0.138461, 0.138461, 0.138461, 0.144421, 
                                                                                                                                                0.144421, 0.144421), X27.024 = c(0.0752111, 0.0752111, 0.0752111, 
                                                                                                                                                                                 0.0426819, 0.0426819, 0.0426819), X33.031 = c(3.75788, 3.75788, 
                                                                                                                                                                                                                               3.75788, 3.12581, 3.12581, 3.12581), jar_camp = c("1_pf1.1", 
                                                                                                                                                                                                                                                                                 "2_pf1.1", "3_pf1.1", "1_pf2.1", "2_pf2.1", "3_pf2.1"), jar = structure(c(1L, 
                                                                                                                                                                                                                                                                                                                                                           12L, 23L, 1L, 12L, 23L), .Label = c("1", "10_blank", "11", "12", 
                                                                                                                                                                                                                                                                                                                                                                                               "13", "14", "15", "16_blank", "17", "18", "19", "2", "20_blank", 
                                                                                                                                                                                                                                                                                                                                                                                               "21", "22", "23", "24", "25", "26", "27", "28", "29", "3", "30_blank", 
                                                                                                                                                                                                                                                                                                                                                                                               "31", "32", "33", "34", "35", "36", "37", "38_blank", "39", "4", 
                                                                                                                                                                                                                                                                                                                                                                                               "40", "41", "42", "43", "44_blank", "45", "46", "47", "48", "49", 
                                                                                                                                                                                                                                                                                                                                                                                               "5_blank", "blank_50", "51", "52", "53", "54", "55", "56", "57", 
                                                                                                                                                                                                                                                                                                                                                                                               "6", "7", "8", "9", "X_blank"), class = "factor"), campaign = c("pf1.1", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                               "pf1.1", "pf1.1", "pf2.1", "pf2.1", "pf2.1"), i.X26.013 = c(0.144658, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           0.21502, 0.458296, 0.191571, 0.0789067, 0.711814), i.X27.024 = c(0.0595547, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            0.0651149, 0.146772, 0.0997815, 0.0539976, 0.185398), i.X33.031 = c(5.4066, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                3.30406, 18.0479, 6.13854, 1.3028, 22.2226)), sorted = "Stamp_summertime", class = c("data.table", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     "data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x00000237a3d91ef0>)

标签: rtidyverse

解决方案


我们可以创建 2 个位置向量并直接减去列。既然你有data.table我们用来..column_number按位置选择列。

library(data.table)
col1group <- 2:4
col2group <- 8:10

df[, ..col1group] - df[, ..col2group])

如果要将它们作为新列添加到原始数据中,可以重命名它们并cbind

cbind(df, setNames(df[, ..col1group] - df[, ..col2group],
                   paste0(names(df)[col1group], '_diff')))

推荐阅读