如何使用dplyr包创建一个包含数学运算的“by”连接

kknvjkwl  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(127)

我看了所有的论坛,没有找到我要找的东西。
让我们以包含年份的数据库为例:

dplyr::storms

name   year month   day  hour   lat  long status              category  wind pressure tropicalstorm_force_… hurricane_force…
   <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>               <ord>    <int>    <int>                 <int>            <int>
 1 Amy    1975     6    27     0  27.5 -79   tropical depression -1          25     1013                    NA               NA
 2 Amy    1975     6    27     6  28.5 -79   tropical depression -1          25     1013                    NA               NA
 3 Amy    1975     6    27    12  29.5 -79   tropical depression -1          25     1013                    NA               NA
 4 Amy    1975     6    27    18  30.5 -79   tropical depression -1          25     1013                    NA               NA
 5 Amy    1975     6    28     0  31.5 -78.8 tropical depression -1          25     1012                    NA               NA
 6 Amy    1975     6    28     6  32.4 -78.7 tropical depression -1          25     1012                    NA               NA
 7 Amy    1975     6    28    12  33.3 -78   tropical depression -1          25     1011                    NA               NA
 8 Amy    1975     6    28    18  34   -77   tropical depression -1          30     1006                    NA               NA
 9 Amy    1975     6    29     0  34.4 -75.8 tropical storm      0           35     1004                    NA               NA
10 Amy    1975     6    29     6  34   -74.8 tropical storm      0           40     1002                    NA               NA
# … with 11,849 more rows

我想使用“year”列作为操作的键进行左连接,但格式为“year+1”,以便为每行提供下一年的信息
所以基本上

Joint= storms %>% left_join(storms, by=c("name",year+1="year"))

有没有简单的方法来实现它,或者我必须在进行left_join之前不可避免地创建year+1列?
谢谢

8zzbczxx

8zzbczxx1#

用一个最小的例子更容易说明这一点,所以我们将使用R附带的BOD
在当前版本的dplyr中,您必须创建一个新列,但这可以通过流水线中的sqldf来完成,如果您不希望出现时间2,请省略以-结尾的行。

library(dplyr)
library(sqldf)

BOD %>% 
  { sqldf("select 
     a.* 
     , b.Time Time2 -- 
     , b.demand demand2
    from [.] a
    left join [.] b on a.Time + 1 = b.Time") 
  }
##   Time demand Time2 demand2
## 1    1    8.3     2    10.3
## 2    2   10.3     3    19.0
## 3    3   19.0     4    16.0
## 4    4   16.0     5    15.6
## 5    5   15.6    NA      NA
## 6    7   19.8    NA      NA

我们也可以使用match

library(dplyr)
BOD %>%
  mutate(Time2 = Time + 1, demand2 = demand[match(Time2, Time)])
##   Time demand Time2 demand2
## 1    1    8.3     2    10.3
## 2    2   10.3     3    19.0
## 3    3   19.0     4    16.0
## 4    4   16.0     5    15.6
## 5    5   15.6     6      NA
## 6    7   19.8     8      NA

或者如果你不想要时间2

library(dplyr)
BOD %>%
  mutate(demand2 = demand[match(Time + 1, Time)])
##   Time demand demand2
## 1    1    8.3    10.3
## 2    2   10.3    19.0
## 3    3   19.0    16.0
## 4    4   16.0    15.6
## 5    5   15.6      NA
## 6    7   19.8      NA

相关问题