如何基于其他数据帧中的信息减去R个数据帧列?

时间:2020-09-09 09:05:45

标签: r dataframe

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

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

输入数据帧:

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

键数据框在基础数据框中的每一列都有一行,而“ include”列必须设置为“ yes”才能进行任何计算。如果将其设置为yes,那么我想添加一个新列,该列的定义名称应减去给定列。

例如,将基本数据框中的“ C”列设置为包括在内,因此我想创建一个名为“ H”的新列,该列具有“ C”列的值减去“ B”列的值。

我以为可以循环执行此操作,但是我的尝试未成功,搜索没有找到任何有帮助的内容(我有点新)。任何帮助将不胜感激。

sessioninfo(): R版本3.4.2(2017-09-28) 平台:x86_64-w64-mingw32 / x64(64位) 在以下环境下运行:Windows 10 x64(内部版本18363)

Matrix产品:默认

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

附带的基本软件包: [1]统计图形grDevices utils数据集方法基础

通过名称空间(未附加)加载: [1]编译器_3.4.2工具_3.4.2

2 个答案:

答案 0 :(得分:1)

以下为您工作吗?

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

答案 1 :(得分:1)

这是基本的R选项

k <- subset(key, include == "yes")
output <- cbind(base,setNames(base[k[["cols"]]]-base[k[["subtract"]]],k$names))

我们将会得到

> 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