изменение значений фрейма данных в соответствии с непрерывными интервалами другого фрейма данных - PullRequest
0 голосов
/ 15 мая 2018

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

df<-read.table(text="   V1  V2  V3  V4  V5
1   id1 id2 (1,2.5) (2.5,4) (4,5.5)
2   a   a   1.5147654   1.5147654   1.5147654
3   a   c   1.97638457  1.97638457  1.97638457
4   c   d   1.55151792  -2.38160971 1.55151792
5   a   b   2.25182522  2.25182522  -1.3523473
6   b   d   1.85349445  1.85349445  1.85349445
",
                 header=TRUE)

Как показано, первая строка этого содержит числовые интервалы, и я не знаю, как читать их в R как непрерывные диапазоны.

Во-вторых, у меня есть несколько таблиц, которые я хочу сравнить между их значениями и этим основным фреймом данных. Для иллюстрации подмножество моей таблицы выглядит так:

sample<-read.table(text="   V1  V2  V3
               1    a   b   1
               2    a   c   1.5
               3    d   b   3.5
               4    d   c   5.1
               ",
                 header=TRUE)

Мне нравится сравнивать сэмпл с моим df, например, в первом ряду сэмпла «a» находится рядом с «b» со значением «1». Однако в df, если рядом стоит a, а значение равно 1, в соответствии с интервалами оно должно быть изменено на 2.25182522 в таблице примеров. Окончательный результат будет выглядеть так:

    V1  V2  V3
1   a   b   2.25182522
2   a   c   1.97638457
3   d   b   1.85349445
4   d   c   1.55151792

Поскольку у меня много примеров таблиц, и они имеют большой размер, есть идеи?

1 Ответ

0 голосов
/ 15 мая 2018

Ваш первый вопрос для меня неопределенный. Но для вашего второго вопроса, я думаю, что это вопрос слияния. Ключ заключается в создании идентификатора слияния на основе порядка от V1 и V2 обоих наборов данных. Следующий код на основе пакета сначала создает этот идентификатор слияния, а затем проводит left_join. df3 - конечный результат.

library(dplyr)

df3 <- df2 %>%
  mutate(Merge_ID = apply(df2[, c("V1", "V2")], 1, 
                          function(x) paste0(sort(x), collapse = "_"))) %>%
  select(-V3) %>%
  left_join(df1 %>% mutate(
         Merge_ID = apply(df1[, c("V1", "V2")], 1, 
                          function(x) paste0(sort(x), collapse = "_"))) %>%
           select(Merge_ID, V3),
            by = "Merge_ID") %>%
  select(-Merge_ID) %>%
  mutate(V3 = as.numeric(V3))
df3
#   V1 V2       V3
# 1  a  b 2.251825
# 2  a  c 1.976385
# 3  d  b 1.853494
# 4  d  c 1.551518

DATA

df1 <- read.table(text="   V1  V2  V3  V4  V5
1   id1 id2 (1,2.5) (2.5,4) (4,5.5)
2   a   a   1.5147654   1.5147654   1.5147654
3   a   c   1.97638457  1.97638457  1.97638457
4   c   d   1.55151792  -2.38160971 1.55151792
5   a   b   2.25182522  2.25182522  -1.3523473
6   b   d   1.85349445  1.85349445  1.85349445
",
               header=TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text="   V1  V2  V3
               1    a   b   1
               2    a   c   1.5
               3    d   b   3.5
               4    d   c   5.1
               ",
                   header=TRUE, stringsAsFactors = FALSE)
...