我有这个数据表.

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

所以基本上这段代码的作用是.

  1. 标识主表中映射表中的列.
  2. 将这些列连接起来.
  3. 将这些串联列与映射表的串联列进行匹配.
  4. 从映射表中索引所需的列,并将其固定到主表.

所以想要的结果是

> 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包.

推荐答案

我认为这里最大的问题不是合并/联接的基本机制,它是在要联接的列未知的情况下进行的,要联接到df的列也是未知的.

我认为这是一个合理的方法:

df <- data.table::as.data.table(structure(list(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)), row.names = c(NA, -8L), class = c("data.table", "data.frame" )))
map <- data.table::as.data.table(structure(list(up = c("d", "i", "4"), vehicle = c("yh", "we", "we"), exercise = c("ty", "45", "k")), class = c("data.table", "data.frame"), row.names = c(NA, -3L)))

(same <- intersect(names(map), names(df)))
# [1] "up"      "vehicle"
(diff <- setdiff(names(map), names(df)))
# [1] "exercise"
if (length(same) && length(diff)) 
  df[map, c(diff) := mget(diff), on = same]
#     class value vehicle carbon    cap     up   down   amt exercise
#    <char> <num>  <char>  <num> <char> <char> <char> <num>   <char>
# 1:      a  0.76      we  0.984      3      4      t    34        k
# 2:      c  0.91      df  0.270      2      2      e    23     <NA>
# 3:      v  1.94      rt  0.419      1      3      r    12     <NA>
# 4:      f  0.37      yh  0.469      6      d      3    67       ty
# 5:      r  1.35      uj  0.132      y      t      4    87     <NA>
# 6:      b  0.75      er  0.865      t      y      5    43     <NA>
# 7:      t  1.95      ed  0.562      4      u      2    23     <NA>
# 8:      o  1.69      we  0.133      6      i      1    12       45

诚然,当mapdf中有意外的列时,可能有几个地方会出错.

我添加了if (length(same) && length(diff))部分,这样我们就不会无意中try 在零列上联接或在没有列中合并.

R相关问答推荐

如何正确使用' programme::programme_bar$Message()'?

Select R中列未排序的收件箱中的最后一个按顺序编号的列

如何判断某列中由某些行组成的百分比

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

从API中抓取R数据SON

使用gggrassure减少地块之间的空间

通过使用str_detect对具有相似字符串的组进行分组

如何在R中合并和合并多个rabrame?

整数成随机顺序与约束R?

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

如何自定义3D散点图的图例顺序?

如果某些列全部为NA,则更改列

R中的时间序列(Ts)函数计数不正确

如何对2个列表元素的所有组合进行操作?

使用带有OR条件的grepl过滤字符串

在使用具有Bray-Curtis相似性的pvCluust时计算p值

如何在ggplot2中创建多个y轴(每个变量一个)

在ggplot2上从多个数据框创建复杂的自定义图形

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

长/纬点继续在堪萨斯-SF结束,整齐的人口普查