我有这个数据表.
library(data.table)
class<- c("a","c","v","f","r","b","t","o");
value<-c(0.76, 0.91, 1.94, 0.37, 1.35, 0.75, 1.95, 1.69);
vehicle<-c("we", "df", "rt", "yh", "uj", "er", "ed","we")
carbon<-c(0.984, 0.27, 0.419, 0.469, 0.132, 0.865, 0.562, 0.133)
cap<-c(3, 2, 1, 6, "y", "t", 4, 6)
up<-c(4, 2, 3, "d", "t", "y", "u", "i")
down<-c("t", "e", "r", 3, 4, 5, 2, 1)
amt<-c( 34, 23, 12, 67, 87, 43, 23, 12)
df<-data.table(class,value,vehicle,carbon,cap,up,down,amt)
这是另一个映射表
up<-c("d","i",4)
vehicle<-c("yh", "we", "we")
exercise<-c("ty",45, "k")
map<-data.table(cbind(vehicle,up,exercise))
我需要表格df
中的第exercise
栏
我目前使用的是这段代码,它可以产生预期的结果.我对此很满意.
df[,names(map)[length(names(map))]:=
map$exercise[match(do.call(paste0,df[, which(names(df) %in% names(map)[1:(ncol(map)-1)]),with = FALSE]),
do.call(paste0,map[,1:(ncol(map)-1)]))] ]
所以基本上这段代码的作用是.
- 标识主表中映射表中的列.
- 将这些列连接起来.
- 将这些串联列与映射表的串联列进行匹配.
- 从映射表中索引所需的列,并将其固定到主表.
所以想要的结果是
> df$exercise
[1] "k" NA NA "ty" NA NA NA "45"
但有时映射表的列顺序会改变.
例如,更改的映射表为 请注意,现在订单是UP,然后是Vehicle.在这种情况下,上面的代码将不会产生预期的结果,事实上,它将完全是NA.
up<-c("d","i",4)
vehicle<-c("yh", "we", "we")
exercise<-c("ty",45, "k")
map<-as.data.frame(cbind(up,vehicle,exercise))
setDT(map)
因此,我的代码只有在映射表中的列顺序与主表中的列顺序相同时才起作用. 如果我的代码可以更改为执行相同的结果,但考虑到列的顺序. 理想情况下,希望它尽可能具有动态化.
映射表可以具有与主表中一样多的列和需要插入到主表中的附加列.
如果您需要进一步的澄清,请发表意见. 如果我的给定代码可以编辑和提供,我将不胜感激. 任何其他代码也是受欢迎的. 我更喜欢使用data.table包.