[英]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,我們可以使用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])
這是來自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.