在 R 中:根据最近日期从列中提取数据

问题描述 投票:0回答:1

我有两个数据集。第一个数据集是主要数据集,很宽,并且具有 id 作为唯一/识别变量。第二个数据集具有相同的 id 变量,很长,并且对 id 有多个观察值(即 id 不是唯一的)。

第二个数据集只有三个变量:id、date 和 value。 ID 和日期在一起也不是唯一的 - 存在重复的组合。值变量是一个数字。令人烦恼的是,一些 ID/日期重复项在值字段中具有不同的数字,因此我需要识别这些数字,以便我可以手动选择我需要的值。

我的最终目标是使用日期与第一个数据集中的关键日期最接近的观察将第二个数据集中的值字段复制到第一个数据集中。例如,假设在第一个数据集中,id==1 的关键日期为 5/1/2024。然后在第二个数据集中,有一行 id==1、date==4/30/2024、value==3;还有另一行 id==1、日期==5/5/2024 和值==4。我希望将 3 拉入第一个数据集并放入 id==1 的新列中。

https://github.com/markelphelps/sample-data-1 查看我的 github 中的文件。第二个数据集以 df2_long 开始,我尝试将其变成 df2_wide。相反,我能做的最好的事情是:

df_long2 <- reshape(df_long,
                       timevar = "date",
                       idvar = "id",
                       direction = "wide")

我希望它能创建两个新列:日期和值。相反,它为每个唯一日期创建一个新列。由于日期中的重复,使用pivot_wider给了我一个列表列。

我确实收到错误“每个日期有多行;”我猜解决这个问题的最简单方法是在重塑之前删除一些内容,但我不确定如何做。类似于“打印 df 的每一行,其中 id 相等且 date 相等”。也许带有 for 循环或 lapply/sapply 的东西可以为每个唯一的 id 值回收命令。

接下来我需要找到最近的日期

which.min(abs(df1_main$key_date - df2_long$date))

我读到,abs() 是必要的,因为 df2_long$date 有时在 df1_main$key_date 之前,有时在 df1_main$key_date 之后。但我收到一条错误消息“未为“日期”对象定义abs”。当我取出abs()时,命令返回“integer(0)”,这似乎不是很有用。

找到最接近的日期后的下一步是对所有 id 执行此操作,然后将它们转换为新变量。

编辑:今天下班,明天检查/回复评论

r date extract
1个回答
0
投票

你可以尝试一下:

### Packages
library(dplyr)
library(readr)
library(lubridate)

### Data
df_ex_original = read_csv("C:/Users/your_name/your_folder/df ex_original.csv")
df_ex_long = read_csv("C:/Users/your_name/your_folder/df ex_long.csv")

### Format correctly the columns which contain the dates
df1=df_ex_original %>% select(1,2) %>% mutate(key_date=mdy(key_date))
df2=df_ex_long %>% mutate(date=mdy(date))

### Join steps to find the closest date and the corresponding value for each id
### A count column has been added to identify duplicates
df1 %>%
  left_join(y = df2, by = join_by(id,closest(key_date<=date))) %>% 
  left_join(y = df2, by = join_by(id,closest(key_date>=date))) %>% 
  mutate(value=pmin(value.x,value.y,na.rm = TRUE)) %>% 
  select(id,key_date,last_col()) %>% 
  group_by(id) %>% 
  mutate(n=n())

输出:

# A tibble: 7 × 4
# Groups:   id [6]
     id key_date   value     n
  <dbl> <date>     <dbl> <int>
1     1 2024-01-06     3     1
2     2 2024-01-01     1     1
3     3 2024-01-10     1     1
4     4 2024-01-12     0     1
5     5 2024-01-14     6     1
6     6 2024-01-02     5     2
7     6 2024-01-02     1     2
© www.soinside.com 2019 - 2024. All rights reserved.