создание цикла для сопоставления значения в одной таблице с другой, проверка логичности, экспорт результата - PullRequest
0 голосов
/ 18 января 2019

У меня есть две таблицы.Я хочу сопоставить каждое значение в одной таблице с другой, и с помощью критерия я хочу проверить, является ли это значение совместимым во второй таблице.После тестирования я хотел бы экспортировать результаты в третью таблицу и сделать это с помощью функции for loop в r, например:

df1 <- read.table(text = "ID1 Value1
A 1
B 2
C 3", stringsAsFactors = FALSE, header = TRUE)

df2 <-read.table(text = "ID1 Value2
D 1
E 2
F 3", stringsAsFactors = FALSE, header = TRUE)

Для сопоставления каждое значение в df1 - df2 Я хочу, чтобы критерии были

ОБА

df1$Value1 >= 0.5*df2$Value2

И

df1$Value1 <= 2*df2$Value2

Например, при сопоставлении A в df1 с D в df2 критерий равен A>=0.5D И A<=2D, если да, экспортируйте результат в новую таблицу.

Алгоритм будет таким: enter image description here

Финальная таблица будет:

ID1 Value1 ID2 Value2
A 1 D 1
A 1 E 2
B 2 D 1
B 2 E 2
B 3 F 3
C 3 E 2
C 3 F 3

Ответы [ 2 ]

0 голосов
/ 18 января 2019

A dplyr способ с outer():

library(dplyr)

outer(setNames(df1$Value1, df1$ID1), setNames(df2$Value2, df2$ID1), function(x, y){
  x >= 0.5*y & x <= 2*y
}) %>% as.table %>% as.data.frame %>%
  subset(Freq, select = -Freq) %>%
  left_join(df1, by = c("Var1" = "ID1")) %>%
  left_join(df2, by = c("Var2" = "ID1")) %>%
  arrange(Var1, Var2)

#   Var1 Var2 Value1 Value2
# 1    A    D      1      1
# 2    A    E      1      2
# 3    B    D      2      1
# 4    B    E      2      2
# 5    B    F      2      3
# 6    C    E      3      2
# 7    C    F      3      3
0 голосов
/ 18 января 2019

Не уверен, почему вам нужно сделать это через цикл for, но здесь есть более R -процесс,

d1 <- setNames(expand.grid(df1$Value1, df2$Value2), c('Value2', 'Value1'))
d2 <- setNames(expand.grid(df1$ID1, df2$ID2), c('ID2', 'ID1'))
d1 <- transform(d1, cond1 = Value2 * 0.5, cond2 = Value2 * 2)
final_d <- cbind(d2, d1)
final_d[final_d$Value1 >= final_d$cond1 & final_d$Value1 <= final_d$cond2,]

, который дает,

  ID2 ID1 Value2 Value1 cond1 cond2
1   A   D      1      1   0.5     2
2   B   D      2      1   1.0     4
4   A   E      1      2   0.5     2
5   B   E      2      2   1.0     4
6   C   E      3      2   1.5     6
8   B   F      2      3   1.0     4
9   C   F      3      3   1.5     6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...