首页 > 解决方案 > 从单个表中查找多个列

问题描述

假设我有以下数据

df <- structure(list(car_model = c(301, 302, 303, 304), colour = c(501, 
502, 503, 504), sales = c(182, 191, 302, 101)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

我有一个查找表,我将在其中获取文本以替换列中的代码car_modelcolour.

tbl1 <- structure(list(txt = c("A", "B", "C", "Y"), cod = c(301, 302, 
303, 304), var = c("car_model", "car_model", "car_model", "car_model"
)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"
))
tbl2 <- structure(list(txt = c("black", "green", "red", "white"), cod = c(501, 
502, 503, 504), var = c("colour", "colour", "colour", "colour"
)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"
))

结合我的两张桌子

tbl <- rbind(tbl1,tbl2)
# A tibble: 8 x 3
  txt     cod var      
  <chr> <dbl> <chr>    
1 A       301 car_model
2 B       302 car_model
3 C       303 car_model
4 Y       304 car_model
5 black   501 colour   
6 green   502 colour   
7 red     503 colour   
8 white   504 colour   

有没有办法以这种方式使用查找表替换主列中的所有列df(通过列中的值匹配列名varcod)或者我需要制作单独的表,每个变量一个表?我的另一个疑问是,在具有约 1000 万行、30 个或更多变量以及总大小约 5000 行的查找表的数据集中执行此操作是否合理。

编辑:关于代码可能在不同的变量中有相同的代码。

EDIT2:我正在寻找一种快速且内存高效的解决方案。也许有一些解决方案data.table

标签: rdata.table

解决方案


一个data.table选项

cbind(unstack(setDT(tbl)[melt(
  setDT(df)[, .(car_model, colour)], ,
  variable.name = "var",
  value.name = "cod"
), .(txt, var), on = .(var, cod)]), df[, .(sales)])

  car_model colour sales
1         A  black   182
2         B  green   191
3         C    red   302
4         Y  white   101

推荐阅读