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)
v1Adplyr
方法是使用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