首页 > 解决方案 > 如何根据其他数据框中的信息减去 R 数据框列?

问题描述

我有一个数据框,我想向其中添加新列,但计算取决于另一个包含指令的数据框中的值。

我在下面创建了一个可重现的示例(尽管实际上还有很多列),

输入数据框:

base <- data.frame("A"=c("orange","apple","banana"),
                   "B"=c(5,3,6),
                   "C"=c(7,12,4),
                   "D"=c(5,2,7),
                   "E"=c(1,18,4))
key <- data.frame("cols"=c("A","B","C","D","E"),
                  "include"=c("no","no","yes","no","yes"),
                  "subtract"=c("na","A","B","C","D"),
                  "names"=c("na","G","H","I","J"))

所需的输出数据帧:

output <- data.frame("A"=c("orange","apple","banana"),
                     "B"=c(5,3,6),
                     "C"=c(7,12,4),
                     "D"=c(5,2,7),
                     "E"=c(1,18,4),
                     "H"=c(2,9,-2),
                     "J"=c(-4,16,-3))

键数据框在基本数据框中的每一列都有一行,并且必须将“包含”列设置为“是”才能完成任何计算。如果它设置为yes,那么我想添加一个具有定义名称的新列,该列减去给定列。

例如,基本数据框中的“C”列设置为包含,因此我想创建一个名为“H”的新列,其中包含“C”列中的值减去“B”列中的值。

我以为我可以通过循环来做到这一点,但我的尝试没有成功,我的搜索也没有找到任何有帮助的东西(我有点新)。任何帮助将非常感激。

sessioninfo():R 版本 3.4.2 (2017-09-28) 平台:x86_64-w64-mingw32/x64 (64-bit) 运行于:Windows 10 x64 (build 18363)

矩阵产品:默认

语言环境:[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252

附加的基础包:[1] stats graphics grDevices utils datasets methods base

通过命名空间加载(未附加):[1] compiler_3.4.2 tools_3.4.2

标签: rdataframe

解决方案


以下内容对您有用吗?

output <- base

for(i in which(key[["include"]] == "yes")){
  key.row <- key[i, ]
  output[[key.row[["names"]]]] <- base[[key.row[["cols"]]]] - base[[key.row[["subtract"]]]]
}

结果:

> output
       A B  C D  E  H  J
1 orange 5  7 5  1  2 -4
2  apple 3 12 2 18  9 16
3 banana 6  4 7  4 -2 -3

推荐阅读