我有一个数据框(df),它与一个数据框列表共享一个键列($ Name):
head(df)
# A tibble: 6 x 3 ##truncating to show first 2 rows only
Name var1 var2
<chr> <chr> <chr>
1 Tom Marks LAX ORD
2 Bob Sells MIA CHI
我有一个数据框列表,其中包含df $ Name中包含的每个人的历史数据。
head(employees$'Tom Marks')
Name date var3
Tom Marks 2017-01-01 250
Tom Marks 2017-01-02 457
head(employees$'Bob Sells')
Name date var3
Bob Sells 2017-01-01 385
Bob Sells 2017-01-02 273
我想在员工列表中将 var3 中的值附加到最近日期的df(这始终是员工中的最后一行) 列表)。例如,输出在将来自df $ Name的 Tom Marks 与员工''Tom Marks'匹配后将如下所示:
head(df)
Name var1 var2 var3
<chr> <chr> <chr> <num>
1 Tom Marks LAX ORD 457
2 Bob Sells MIA CHI 273
我花了相当多的时间研究过滤连接,变异连接,bind_rows,reduce()函数,但是在完成对于一个体面的程序员来说可能是一件容易的事情方面却没有成功。我希望那里的某个人可以让我摆脱困境,提供一些更好的方向或更好的答案!
谢谢!
答案 0 :(得分:1)
如果您总是在最后一行之后,可以使用tail
来获取它:
library(tidyverse)
left_join(
df,
map_df(employees, ~ tail(.x, 1))
)
答案 1 :(得分:0)
此解决方案依赖于您按照自己的意愿排列数据的事实,但如果不是这样,您可以按date
轻松排列列表。
library(tidyverse)
df %>% left_join(
df_list$employees %>%
bind_rows() %>%
group_by(Name) %>%
summarise_at(vars(var3), last))
# Name var1 var2 var3
# 1 Tom Marks LAX ORD 457
# 2 Bob Sells MIA CHI 273
数据
df <- data.frame(Name = c("Tom Marks", "Bob Sells"),
var1 = c("LAX", "MIA"),
var2 = c("ORD", "CHI"))
df_list <- list(employees = list(
`Tom Marks` = data.frame(Name = "Tom Marks",
date = c("2017-01-01", "2017-01-02"),
var3 = c(250, 457)),
`Bob Sells` = data.frame(Name = "Bob Sells",
date = c("2017-01-01", "2017-01-02"),
var3 = c(385, 273))
))