Как создать подмножество из dataframe2 в зависимости от значений в dataframe1 и сложить все подмножества в один dataframe в R? - PullRequest
1 голос
/ 13 апреля 2019

Я хочу создать функцию, которая принимает строку кадра данных df1 (со столбцами x1, x2, x3), а вывод этой функции - это подмножество кадра данных df2 (со столбцами y1, y2), это подмножество былорассчитывается на основе значений в строке df1.Я хочу применить эту функцию для каждой строки df1 и поместить результирующие кадры данных (подмножества df2) в один большой кадр данных.Пример того, как это можно сделать с помощью цикла for: Пример df1:

x1   x2   x3
a    3.1  4.5
b    9.0  10.1
a    9.0  20.0
c    1.1  6.0

Пример df2:

y1  y2
a   4.0
a   10.0
a   3.5
b   9.8
b   9.5
b   25.0
c   8.2
c   12.0

Пример цикла for, который выполняет эту обработку:

desired_df = df2[1, ]
for (i in 1:nrow(df1)) {
  subset = filter(df2, y1 == df1[i, "x1"] & y2 > df1[i, "x2"] & y2 < df1[i, "x3"])
  desired_df = rbind(desired_df, subset)
}
desired_df = desired_df[-1, ]

желаемый фрейм данных:

  y1   y2
  a  4.0
  a  3.5
  b  9.8
  b  9.5
  a 10.0

В зависимости от значений в df1, поднабор может давать фреймы данных различной длины (иногда нет элементов). Вопрос в том, как написать этот процесс.подмножество и добавление в векторизованном виде, без цикла for?

1 Ответ

0 голосов
/ 14 апреля 2019

Похоже, нам нужно fuzzy_join

library(dplyr)
library(fuzzyjoin)
fuzzy_inner_join(df1, df2, by = c('x1' = 'y1', 'x2' = 'y2', 'x3' = 'y2'),
          match_fun = list(`==`, `<=`, `>`)) %>%
    select(names(df2))
#  y1   y2
#1  a  4.0
#2  a  3.5
#3  b  9.8
#4  b  9.5
#5  a 10.0

данные

df1 <- structure(list(x1 = c("a", "b", "a", "c"), x2 = c(3.1, 9, 9, 
1.1), x3 = c(4.5, 10.1, 20, 6)), class = "data.frame", row.names = c(NA, 
-4L))

df2 <- structure(list(y1 = c("a", "a", "a", "b", "b", "b", "c", "c"), 
    y2 = c(4, 10, 3.5, 9.8, 9.5, 25, 8.2, 12)), class = "data.frame", 
    row.names = c(NA, 
-8L))
...