考虑以下提供的数据集(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”来解决此问题。任何输入都会真正有帮助。
答案 0 :(得分:0)
在基数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])
答案 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))