R将最后一行附加到数据框

时间:2018-06-11 02:17:32

标签: r filter append

我有一个数据框(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()函数,但是在完成对于一个体面的程序员来说可能是一件容易的事情方面却没有成功。我希望那里的某个人可以让我摆脱困境,提供一些更好的方向或更好的答案!

谢谢!

2 个答案:

答案 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))
))