Условный rbind - PullRequest
       5

Условный rbind

0 голосов
/ 20 сентября 2018

У меня есть два кадра данных:

df1<-data.frame(ID = c(1,1,2,3,3,4,5,6), 
           week = c(20,23,10,15,20,40,10,12), 
           var1 = rep(1, 8))
df2<-data.frame(ID=c(1,1,1,2,2,3,5),
            week = c(18,19,22,8,9,14,9),
            var1= rep(0,7))

Я хотел бы объединить их со следующими условиями:

1. Keep all of df1
2. Only add the rows from df2 where the df2$week = df1$week-1

Вывод будет выглядеть следующим образом:

    ID week var1
1   1   19    0
2   1   20    1
3   1   22    0
4   1   23    1
5   2    9    0
6   2   10    1
7   3   14    0
8   3   15    1
9   5    9    0
10  5   10    1
11  6   12    1

Это вариант предыдущего вопроса, в котором спрашивается, как сохранить строку в одном условии и строку над ним в другом.С тех пор я разбил данные на два фрейма данных, предполагая, что их условно легче связать.Я попытался:

df3<-rbind.data.frame(ifelse(df2$ID==df1$ID & df2$week==df2$week-1, df1, df2))

Но я получаю сообщение об ошибке:

longer object length is not a multiple of shorter object length. 

Я чувствую, что это очень близко к получению желаемого результата, но я не очень опытен сrbind.Спасибо!

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Другой подход:

library(tidyverse)

# List the weeks preceding those in df1
df1_wks <- unique(df1$week) - 1

# Combine df1 with the appropriate rows of df2
bind_rows(df1, 
          df2 %>% filter(week %in% df1_wks)) %>%
  arrange(ID, week)

Вывод:

   ID week var1
1   1   19    0
2   1   20    1
3   1   22    0
4   1   23    1
5   2    9    0
6   2   10    1
7   3   14    0
8   3   15    1
9   3   20    1
10  4   40    1
11  5    9    0
12  5   10    1
13  6   12    1
0 голосов
/ 20 сентября 2018

Использование base R

df <- rbind(df1, df2[df2$week %in% (df1$week - 1), ])
df
   ID week var1
1   1   20    1
2   1   23    1
3   2   10    1
4   3   15    1
5   3   20    1
6   4   40    1
7   5   10    1
8   6   12    1
21  1   19    0
31  1   22    0
51  2    9    0
61  3   14    0
71  5    9    0
0 голосов
/ 20 сентября 2018

Сложные объединения могут быть легко определены прямым способом с использованием SQL.Мы предполагаем, что вы намеревались идентифицировать идентификаторы и в условии 2.

library(sqldf)

sqldf("select b.* from df1 a join df2 b on a.ID = b.ID and b.week = a.week-1 
       union 
       select * from df1 
       order by ID, week")

, что дает:

   ID week var1
1   1   19    0
2   1   20    1
3   1   22    0
4   1   23    1
5   2    9    0
6   2   10    1
7   3   14    0
8   3   15    1
9   3   20    1
10  4   40    1
11  5    9    0
12  5   10    1
13  6   12    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...