r - 从 dplyr 中的不同来源有条件地选择
问题描述
不幸的是,我不确定如何问这个问题,但我认为必须有比我想出的更简单的解决方案。
下面我有df1
每日数据测量变量x
。还有df2
一个是一年一度的,其中有一列表示一年中的某一天。我想x
从df1
. 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
解决方案
我认为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
推荐阅读
- angular - 如何获取新项目ngrx的ID
- php - RegEx - 匹配括号中所有未引用的字符串,除非它们都是大写字母
- sql - 用于选择列中具有一个值但缺少另一个值的记录的 SQL 查询
- python - 如何删除给出这个的vscode自动完成?
- php - 将数据存储在数据库表或数组上
- c++ - 如何在 vim 中导航 c++ 模板实例化?
- c# - C# 在 XY 网格上查找附近的点
- swift - INSearchForNotebookItemsIntent 未达到 IntentsUI 扩展
- laravel - 在 laravel 文件管理器中将文件和照片文件夹更改为一个存储文件夹
- postgresql - 无法在 Ubuntu 17.10 上使用 postgis 安装 postgres 9.3