Храните одинаковые идентификаторы в разных фреймах данных - PullRequest
2 голосов
/ 23 января 2020

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

df1 <- data.frame(id = c(1,2,3,4,5), var = c(2,4,52,2,5))
df2 <- data.frame(id  = c(1,3,4,5,6), var = c(4,5,2,6,2))
df3 <- data.frame(id = c(1,3,5), var = c(31,3,5))

Как можно использовать столбец идентификатора для сохранения во всех трех кадрах данных строк, имеющих в трех кадрах данных один и тот же идентификатор?

Пример ожидаемый результат:

df1 <- data.frame(id = c(1,3,5), var = (2,52,5))
df2 <- data.frame(id = c(1,3,5), var = (4,5,6))
df3 <- data.frame(id = c(1,3,5), var = 31,3,5))

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Мы можем использовать intersect, чтобы получить общий идентификатор для всех наборов данных, а затем subset наборы данных на основе идентификаторов

ids <- Reduce(intersect, list(df1$id,  df2$id, df3$id))
df1 <- subset(df1, id %in% ids)
df2 <- subset(df2, id %in% ids)
df3 <- subset(df2, id %in% ids)

Кроме того, все наборы данных можно загрузить в list

lst1 <-  mget(ls(pattern = "^df\\d+$"))
ids <- Reduce(intersect, lapply(lst1, `[[`, 'id'))
lapply(lst1, subset, id %in% ids)
#$df1
#  id var
#1  1   2
#3  3  52
#5  5   5

#$df2
#  id var
#1  1   4
#2  3   5
#4  5   6

#$df3
#  id var
#1  1  31
#2  3   3
#3  5   5
1 голос
/ 23 января 2020

Один dplyr параметр может быть:

bind_rows(list(df1, df2, df3), .id = "df_id") %>%
 mutate(df_id_dist = n_distinct(df_id)) %>%
 group_by(id) %>%
 filter(n_distinct(df_id) == df_id_dist) %>%
 select(-df_id_dist) %>%
 ungroup() %>%
 group_split(df_id)

[[1]]
# A tibble: 3 x 3
  df_id    id   var
  <chr> <dbl> <dbl>
1 1         1     2
2 1         3    52
3 1         5     5

[[2]]
# A tibble: 3 x 3
  df_id    id   var
  <chr> <dbl> <dbl>
1 2         1     4
2 2         3     5
3 2         5     6

[[3]]
# A tibble: 3 x 3
  df_id    id   var
  <chr> <dbl> <dbl>
1 3         1    31
2 3         3     3
3 3         5     5

Для автоматической загрузки в DFS:

mget(ls(pattern = "^df")) %>%
 bind_rows(., .id = "df_id") %>%
 mutate(df_id_dist = n_distinct(df_id)) %>%
 group_by(id) %>%
 filter(n_distinct(df_id) == df_id_dist) %>%
 select(-df_id_dist) %>%
 ungroup() %>%
 group_split(df_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...