将一个数据集与另一个数据集进行匹配,并使用R

时间:2019-05-15 04:08:57

标签: r

考虑以下提供的数据集(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匹配,并分别为value_1和value_2分配'sd_value_v1','sd_value_v2'。

D2指定的是,如果v1的值小于或等于0.2,则将sd_value_v1(1)分配给value_1。同样,如果该值小于0.4且大于0.2,则将(2)的sd_value_v1分配给相应的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 :(得分:0)

在基数R中,我们可以将mapply列中的cutbreaks列中的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])

答案 1 :(得分:0)

这是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))