R 基于在另一个data.table上的行值查找创建列

R 基于在另一个data.table上的行值查找创建列,r,dplyr,data.table,R,Dplyr,Data.table,我可以很容易地解决这个问题,但我想知道正确的data.table方法是什么。 向上投票选择一种dplyr方式 我有两个数据。表类似 this that year 1: 5 a 2016 2: 6 b 2016 3: 7 c 2017 4: 8 d 2018 及 并希望在适当的列中查找该值。结果将是 this that year valueForYear 1: 5 a 2016 51 2: 6

我可以很容易地解决这个问题,但我想知道正确的
data.table
方法是什么。 向上投票选择一种
dplyr
方式

我有两个
数据。表类似

   this that year
1:    5    a 2016
2:    6    b 2016
3:    7    c 2017
4:    8    d 2018

并希望在适当的列中查找该值。结果将是

   this that year valueForYear
1:    5    a 2016           51
2:    6    b 2016           81
3:    7    c 2017           92
4:    8    d 2018          103
表的DPUT:

dt1 <- structure(list(this = 5:8, that = c("a", "b", "c", "d"), year = c(2016L, 
2016L, 2017L, 2018L)), row.names = c(NA, -4L), class = c("data.table", 
"data.frame"))

dt2 <- structure(list(this = c(5L, 5L, 6L, 6L, 7L, 8L, 9L), that = c("a", 
"b", "a", "b", "c", "d", "e"), Mkt.2016 = c(51L, 61L, 71L, 81L, 
91L, 101L, 111L), Mkt.2017 = c(52L, 62L, 72L, 82L, 92L, 102L, 
112L), Mkt.2018 = c(53L, 63L, 73L, 83L, 93L, 103L, 113L)), row.names = c(NA, 
-7L), class = c("data.table", "data.frame"))

dt1我们可以
melt
到“long”格式,然后进行连接。仅使用
data.table
方法作为输入对象也是
data.table

library(data.table)
v1 <- melt(dt2, id.var = c('this','that'))[dt1, 
        .(value[year == sub("Mkt\\.", "", variable)]), on = .(this, that)]$V1
dt1[, valueForYear := v1]
dt1
#   this that year valueForYear
#1:    5    a 2016           51
#2:    6    b 2016           81
#3:    7    c 2017           92
#4:    8    d 2018          103
库(data.table)

v1我们可以
融化为“long”格式,然后进行连接。仅使用
data.table
方法作为输入对象也是
data.table

library(data.table)
v1 <- melt(dt2, id.var = c('this','that'))[dt1, 
        .(value[year == sub("Mkt\\.", "", variable)]), on = .(this, that)]$V1
dt1[, valueForYear := v1]
dt1
#   this that year valueForYear
#1:    5    a 2016           51
#2:    6    b 2016           81
#3:    7    c 2017           92
#4:    8    d 2018          103
库(data.table)

v1A
dplyr
方法是使用
pivot\u longer
以长格式获取
dt2
,并加入
dt1

library(dplyr)

dt2  %>%
  tidyr::pivot_longer(cols = -c(this, that), 
                      names_to = c(".value", "year"), 
                      names_sep = "\\.") %>%
   type.convert(as.is  = TRUE) %>%
   right_join(dt1, by = c('this', 'that', 'year'))

# A tibble: 4 x 4
#   this that   year   Mkt
#  <int> <chr> <int> <int>
#1     5 a      2016    51
#2     6 b      2016    81
#3     7 c      2017    92
#4     8 d      2018   103
库(dplyr)
dt2%>%
tidyr::pivot_longer(cols=-c(这个,那个),
名称_to=c(“.value”,“year”),
名称\u sep=“\\.”%>%
type.convert(as.is=TRUE)%>%
右键连接(dt1,by=c('this','that','year'))
#一个tibble:4x4
#今年那一年
#     
#1 5 a 2016 51
#2 6 b 2016 81
#3 7 c 2017 92
#2018年4月8日103

一种
dplyr
方法是使用
pivot\u longer
以长格式获取
dt2
,然后加入
dt1

library(dplyr)

dt2  %>%
  tidyr::pivot_longer(cols = -c(this, that), 
                      names_to = c(".value", "year"), 
                      names_sep = "\\.") %>%
   type.convert(as.is  = TRUE) %>%
   right_join(dt1, by = c('this', 'that', 'year'))

# A tibble: 4 x 4
#   this that   year   Mkt
#  <int> <chr> <int> <int>
#1     5 a      2016    51
#2     6 b      2016    81
#3     7 c      2017    92
#4     8 d      2018   103
库(dplyr)
dt2%>%
tidyr::pivot_longer(cols=-c(这个,那个),
名称_to=c(“.value”,“year”),
名称\u sep=“\\.”%>%
type.convert(as.is=TRUE)%>%
右键连接(dt1,by=c('this','that','year'))
#一个tibble:4x4
#今年那一年
#     
#1 5 a 2016 51
#2 6 b 2016 81
#3 7 c 2017 92
#2018年4月8日103

另一个data.table选项

dt1[, .(value = unlist(dt2[this==This & that==That, .SD, 
      .SDcols = paste0('Mkt.', year)])), by = .(This=this, That=that, year)]

#    This That year value
# 1:    5    a 2016    51
# 2:    6    b 2016    81
# 3:    7    c 2017    92
# 4:    8    d 2018   103
或者,更简洁一点

dt2[dt1][, setnames(.SD[,.SD, .SDcols=paste0('Mkt.', year)],1,'Value'), .(this,that,year)]
#    this that year Value
# 1:    5    a 2016    51
# 2:    6    b 2016    81
# 3:    7    c 2017    92
# 4:    8    d 2018   103

另一个data.table选项

dt1[, .(value = unlist(dt2[this==This & that==That, .SD, 
      .SDcols = paste0('Mkt.', year)])), by = .(This=this, That=that, year)]

#    This That year value
# 1:    5    a 2016    51
# 2:    6    b 2016    81
# 3:    7    c 2017    92
# 4:    8    d 2018   103
或者,更简洁一点

dt2[dt1][, setnames(.SD[,.SD, .SDcols=paste0('Mkt.', year)],1,'Value'), .(this,that,year)]
#    this that year Value
# 1:    5    a 2016    51
# 2:    6    b 2016    81
# 3:    7    c 2017    92
# 4:    8    d 2018   103