簡體   English   中英

將數據集與另一個數據集匹配,並使用R指定相應的值

[英]Matching a dataset with another dataset and assigning the respective values using 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的相應值。

例:

value_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'來解決這個問題。 任何輸入都會非常有用。

在基礎R,我們可以使用mapplycutbreaksrange..列和labelssd..列得到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])

這是來自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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM