R hh如何根据条件组合长度不等的数据帧

R hh如何根据条件组合长度不等的数据帧,r,R,我想知道如何最好地组合以下两个数据帧: df1 <- data.frame(Date = c(1,2,3,4,5,6,7,8,9,10), Altitude=c(100,101,101,102,103,99,98,99,89,70)) > df1 Date Altitude 1 1 100 2 2 101 3 3 101 4 4 102 5 5 103

我想知道如何最好地组合以下两个数据帧:

df1 <- data.frame(Date = c(1,2,3,4,5,6,7,8,9,10),
                  Altitude=c(100,101,101,102,103,99,98,99,89,70))

> df1
   Date Altitude
1     1      100
2     2      101
3     3      101
4     4      102
5     5      103
6     6       99
7     7       98
8     8       99
9     9       89
10   10       70

df2 <- data.frame(Start = c(1,4,8),Stop = c(3,7,10),Longitude=c(10,12,13))

> df2
  Start Stop Longitude
1     1    3        10
2     4    7        12
3     8   10        13

我一直在尝试各种细分、筛选。。。但我就是不明白。任何帮助都将不胜感激


善良的问候

通过dplyr的一个想法是完成启动:停止序列、取消启动和合并,即

library(dplyr)

df2 %>% 
 mutate(Date = mapply(seq, Start, Stop)) %>% 
 tidyr::unnest() %>% 
 select(-c(1, 2)) %>% 
 right_join(df1, by = 'Date')
这就给了,


以下是使用
dplyr
包中的
group\u by
group\u modify
函数(2019年5月在0.8.1版中引入)的简洁答案

基本R解决方案:

ind <- apply(df2, 1, function(x) which(df1$Date >= x[1] & df1$Date <= x[2]))
df1$Longitude <- unlist(Map(function(x,y) rep(y, length(x)), ind, df2$Longitude))

unest
来自
tidyr
   Longitude Date Altitude
1         10    1      100
2         10    2      101
3         10    3      101
4         12    4      102
5         12    5      103
6         12    6       99
7         12    7       98
8         13    8       99
9         13    9       89
10        13   10       70
library(dplyr)    
df1 %>% 
      group_by(Date, Altitude) %>%
      group_modify(~ data.frame(df2 %>% 
                                  filter(.x$Date >= Start, .x$Date <= Stop)) %>% 
                                  select(Longitude), 
                   keep = TRUE)
# A tibble: 10 x 3
# Groups:   Date, Altitude [10]
    Date Altitude Longitude
   <dbl>    <dbl>     <dbl>
 1     1      100        10
 2     2      101        10
 3     3      101        10
 4     4      102        12
 5     5      103        12
 6     6       99        12
 7     7       98        12
 8     8       99        13
 9     9       89        13
10    10       70        13
ind <- apply(df2, 1, function(x) which(df1$Date >= x[1] & df1$Date <= x[2]))
df1$Longitude <- unlist(Map(function(x,y) rep(y, length(x)), ind, df2$Longitude))
Date Altitude Longitude
1     1      100        10
2     2      101        10
3     3      101        10
4     4      102        12
5     5      103        12
6     6       99        12
7     7       98        12
8     8       99        13
9     9       89        13
10   10       70        13