Dataframe 根据一个数据帧与另一个数据帧的日期获取差异 数据集A

Dataframe 根据一个数据帧与另一个数据帧的日期获取差异 数据集A,dataframe,Dataframe,因此,如果我的列NewColumn中有a(0/1),我想查看列date,然后查看数据集a中今年和上一年的日期,并根据该日期从数据集B中获取相同日期但提前一个月的值,并将差值放入新数据集中 有没有一种简单的编码方法 如果没有,我想我必须自己用excel手动完成。 还是有一种更省时的方法或技巧可以解决这个问题:) 谢谢:)因为涉及到上个月,将df_A与df_B合并,因此最好通过添加一列,其中包含可以与df_B合并的上一个日期来准备df_A 类似地,当从dfu B中获取数据时,需要从上一个日期减去Va

因此,如果我的列NewColumn中有a(0/1),我想查看列date,然后查看数据集a中今年和上一年的日期,并根据该日期从数据集B中获取相同日期但提前一个月的值,并将差值放入新数据集中

有没有一种简单的编码方法

如果没有,我想我必须自己用excel手动完成。 还是有一种更省时的方法或技巧可以解决这个问题:)


谢谢:)

因为涉及到上个月,将
df_A
df_B
合并,因此最好通过添加一列,其中包含可以与
df_B
合并的上一个日期来准备
df_A

类似地,当从
dfu B
中获取数据时,需要从上一个日期减去
ValueofInterest
,因此最好通过添加一列存储上一个日期的
ValueofInterest
来准备
dfu B

由于在
中提到了日期,因此我更喜欢使用
zoo.yearmon
函数来转换日期

最后,我们可以加入
df_A
df_B
,得到如下结果:

library(zoo)
library(dplyr)

# First prepaer df_A to join
df_A %>% mutate(Date = as.yearmon(Date, "%Y-%m")) %>%
  arrange(Date) %>%
  mutate(DateToJoin = Date - (1/12)) %>% # The previous month for joining
  left_join(df_B %>% mutate(DateToJoin = as.yearmon(paste0(year, month),"%Y%m")) %>%
        arrange(DateToJoin) %>%
        mutate(valueToDeduct = lag(ValueofInterest)),
  by = "DateToJoin") %>%
  mutate(Difference = ifelse(is.na(NewColumn), NA , ValueofInterest-valueToDeduct)) %>%
  select(Name, Date, Value, change, year= year.x, NewColumn, Difference)

#   Name     Date Value change year NewColumn Difference
# 1    A Feb 2000   0.5     NA 2000        NA         NA
# 2    A Mar 2001   0.4 -0.200 2001         0       0.01
# 3    A Feb 2002   1.0  1.500 2002         1      -0.07
# 4    A May 2003   0.9 -0.100 2003         0       0.10
# 5    A Jun 2004   0.9  0.000 2004        NA         NA
# 6    A Mar 2006   0.4 -0.556 2006        NA         NA
数据:

df_A <- read.table(text = 
"Name  Date    Value  change  year NewColumn
A     2000-02   0.5  NA      2000        NA
A     2001-03   0.4  -0.200  2001         0
A     2002-02   1     1.5    2002         1
A     2003-05   0.9  -0.100  2003         0
A     2004-06   0.9   0      2004        NA
A     2006-03   0.4  -0.556  2006        NA",
header=TRUE, stringsAsFactors = FALSE)


df_B <- read.table(text = 
"year      month   ValueofInterest    
1999        12       0.05
2000        1        0.19          
2000        2        0.12   
2000        3        0.07
2000        4        0.11   
2000        5        0.12
2000        6        0.12
2001        1       0.05
2001        2       0.06
2001        3       0.08
2002        1       0.01
2002        2       0.07
2002        3       0.05
2003        1       0.00
2003        2       0.03
2003        3       0.15
2003        4       0.25
2003        5       0.64
2008        11       0.15
2008        12       0.03",
header = TRUE, stringsAsFactors = FALSE)

df_A从
ValueDatasetB
data.frame选择
year
范围的逻辑是什么?请看我提供的答案。在选择上一个日期时,我没有考虑过姓名。如果你的数据有很多名字,你可以考虑在<代码>名称< /代码>上分组。@ BLY12BLU12谢谢更新。第一部分我现在明白了。对于第二部分,您有mentioend
减值数据集b(1999-09)
我仍然无法理解?如果它只是上一个值,则偶数
2001--01的值可用。为什么我们不能接受呢?@bli12blu12我现在已经更新了我的答案。现在,
DateToJoin
是前一个月。例如,对于
2001-03
,我应该在df_B中查找
2001-02
。值为
0.06
。现在我应该查找应该减去的值。如果我查找
一年前的值,则表示
2000-02
。该值为
0.12
。因此答案应该是
0.06-0.12`?根据你上面的例子:
0.06(2001-02)-0.19(2000-01)=-0.13。。。0.01(2002-01)
我很清楚这一点。甚至
0.25(2003-04)
部分也是正确的。没问题。现在,为什么
0.19(2000-01)
?同样,为什么“0.01(2002-01)”呢?还不清楚能不能把我们搅乱。
df_A <- read.table(text = 
"Name  Date    Value  change  year NewColumn
A     2000-02   0.5  NA      2000        NA
A     2001-03   0.4  -0.200  2001         0
A     2002-02   1     1.5    2002         1
A     2003-05   0.9  -0.100  2003         0
A     2004-06   0.9   0      2004        NA
A     2006-03   0.4  -0.556  2006        NA",
header=TRUE, stringsAsFactors = FALSE)


df_B <- read.table(text = 
"year      month   ValueofInterest    
1999        12       0.05
2000        1        0.19          
2000        2        0.12   
2000        3        0.07
2000        4        0.11   
2000        5        0.12
2000        6        0.12
2001        1       0.05
2001        2       0.06
2001        3       0.08
2002        1       0.01
2002        2       0.07
2002        3       0.05
2003        1       0.00
2003        2       0.03
2003        3       0.15
2003        4       0.25
2003        5       0.64
2008        11       0.15
2008        12       0.03",
header = TRUE, stringsAsFactors = FALSE)