首页 > 解决方案 > 从 dplyr 中的不同来源有条件地选择

问题描述

不幸的是,我不确定如何问这个问题,但我认为必须有比我想出的更简单的解决方案。

下面我有df1每日数据测量变量x。还有df2一个是一年一度的,其中有一列表示一年中的某一天。我想xdf1. df2例如,在 1990 年,一年中的标记日df2是 101。我想x从 1990 年的第 101 天获取每年的值,df1依此类推。我写了一个循环来完成这个,但必须有更好的方法。任何帮助表示赞赏。

library(tidyverse)
library(lubridate)
set.seed(123)
df1 <- tibble(Date=seq(as.Date("1990/1/1"), as.Date("1999/12/31"), "days")) %>%
  mutate(Year = year(Date)) %>%
  mutate(DOY = yday(Date)) %>%
  group_by(Year) %>%
  mutate(x = cumsum(runif(n())))
  

df2 <- tibble(Year = seq(1990,1999),
              DOY = c(101,93,94,95,88,100,102,200,301,34),
              x=NA)

df1 %>% filter(Year == 1990, DOY == 101) %>% pull(x)

for(i in 1:10){
  df2$x[i] <- df1 %>% filter(Year == df2$Year[i], 
                             DOY == df2$DOY[i]) %>% pull(x)
}
df2

标签: rdplyr

解决方案


我认为left_join在这种情况下更有效,更容易理解。df3是最终的输出。

library(tidyverse)
library(lubridate)
set.seed(123)
df1 <- tibble(Date=seq(as.Date("1990/1/1"), as.Date("1999/12/31"), "days")) %>%
  mutate(Year = year(Date)) %>%
  mutate(DOY = yday(Date)) %>%
  group_by(Year) %>%
  mutate(x = cumsum(runif(n())))


df2 <- tibble(Year = seq(1990,1999),
              DOY = c(101,93,94,95,88,100,102,200,301,34))

df3 <- df2 %>%
  left_join(df1, by = c("Year", "DOY")) %>%
  select(-Date)

df3
# # A tibble: 10 x 3
#    Year   DOY     x
#    <dbl> <dbl> <dbl>
#  1  1990   101  50.5
#  2  1991    93  45.4
#  3  1992    94  44.8
#  4  1993    95  47.2
#  5  1994    88  45.7
#  6  1995   100  52.2
#  7  1996   102  49.8
#  8  1997   200  96.1
#  9  1998   301 148. 
# 10  1999    34  14.1

推荐阅读