Сопоставление набора данных с другим набором данных и присвоение соответствующих значений с помощью R - PullRequest
0 голосов
/ 15 мая 2019

Рассмотрим приведенный ниже набор данных (D1);

------------------
value_1 | value_2
------------------
  0.05  |   0.56
  0.10  |   0.78
  0.80  |   0.98
  0.45  |   1.50
  0.06  |   2.79
------------------

Мне нужно сопоставить вышеуказанный набор данных с набором данных (D2), представленным ниже;

-----------------------------------------------
range_v1 | sd_value_v1 | range_v2 | sd_value_v2
-----------------------------------------------
   0.2   |     1       |   0.50   |     1
   0.4   |     2       |   0.75   |     2
   0.6   |     3       |   0.90   |     3
   0.8   |     4       |   1.50   |     4
   1.0   |     5       |   3.0    |     5
------------------------------------------------

Мне нужно сопоставить мой D1 с D2 и назначить 'sd_value_v1', 'sd_value_v2' соответственно с value_1 и value_2.

Что указывает D2, так это то, что если значение v1 меньше или равно 0,2, тогда sd_value_v1 (1) присваивается значению_1. Аналогично, если значение меньше 0,4 и больше 0,2, тогда sd_value_v1 of (2) присваивается соответствующему значению value_1.

Пример:

значение_1 = 0,10

Тогда при сопоставлении с D2 я должен получить sd_value_v1 из 5.

Примеры диапазонов (как v1, так и v2):

0 до 0,2 -> 1

0,21 до 0,4 -> 2

0,41 до 0,6 -> 3

0,61 до 0,8 -> 4

0,81 до 1,0 -> 5

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

---------------------------------------------
value_1 | sd_value_v1 | value_2 | sd_value_v2
---------------------------------------------
  0.05  |      1      |   0.56  |     2
  0.10  |      1      |   0.78  |     3
  0.80  |      4      |   0.98  |     4
  0.45  |      3      |   1.50  |     4
  0.06  |      1      |   2.79  |     4
---------------------------------------------

В настоящее время я использую 'R' для решения этой проблемы. Любые входные данные будут действительно полезны.

Ответы [ 2 ]

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

Вот метод из tidyverse

library(tidyverse)
list(df1, df2[c(1, 3)], df2[c(2, 4)])  %>% 
   pmap(~  ..3[findInterval(..1, ..2, left.open = TRUE)+1]) %>%
   set_names(str_c("sd_value", seq_along(.))) %>%
     bind_cols(df1, .)
#   value_1 value_2 sd_value1 sd_value2
#1    0.05    0.56         1         2
#2    0.10    0.78         1         3
#3    0.80    0.98         4         4
#4    0.45    1.50         3         4
#5    0.06    2.79         1         5

данные

df1 <- structure(list(value_1 = c(0.05, 0.1, 0.8, 0.45, 0.06), value_2 = c(0.56, 
0.78, 0.98, 1.5, 2.79)), class = "data.frame", row.names = c(NA, 
-5L))

df2 <- structure(list(range_v1 = c(0.2, 0.4, 0.6, 0.8, 1), sd_value_v1 = 1:5, 
    range_v2 = c(0.5, 0.75, 0.9, 1.5, 3), sd_value_v2 = 1:5), 
    class = "data.frame", row.names = c(NA, 
-5L))
0 голосов
/ 15 мая 2019

В базе R мы могли бы использовать mapply с cut, используя breaks из range.. столбцов и labels из sd.. столбцов, чтобы получить sd_value.

df1[paste0("sd_value", seq_len(ncol(df1)))] <- 
      mapply(function(x, y, z) cut(x, breaks = c(-Inf, y), labels = z), 
      df1, df2[c(TRUE, FALSE)], df2[c(FALSE, TRUE)])

df1
#  value_1 value_2 sd_value1 sd_value2
#1    0.05    0.56         1         2
#2    0.10    0.78         1         3
#3    0.80    0.98         4         4
#4    0.45    1.50         3         4
#5    0.06    2.79         1         5

Выбор столбцов может варьироваться в зависимости от того, как столбцы назначены в вашем фактическом df2.В показанном примере столбцы range.. и sd_value.. расположены поочередно, поэтому я использовал df2[c(TRUE, FALSE)] и df2[c(FALSE, TRUE)] для выбора столбца поочередно.Если в действительности это не так, вы можете использовать grep, чтобы получить индекс столбца на основе их имени

range_cols <- grep("^range", names(df2))
sd_cols <- grep("^sd", names(df2))

, а затем использовать его в mapply, например,

df1[paste0("sd_value", seq_len(ncol(df1)))] <- 
          mapply(function(x, y, z) cut(x, breaks = c(-Inf, y), labels = z), 
          df1, df2[range_cols], df2[sd_cols])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...