基于两个data.frame计算mu值并生成第三个data.frame的技术咨询
问题描述
我有两个数据框:
params:存储参数值,包含a[1]、a[2]、b[1]、b[2]四列,对应两组cid的参数data:存储协变量值,包含cid和rugged_std列,其中cid均为1,共有30个不同的rugged_std值
样本数据如下:
> head(params) # A tibble: 6 × 4 `a[1]` `a[2]` `b[1]` `b[2]` <dbl> <dbl> <dbl> <dbl> 1 0.911 1.06 0.240 0.00333 2 0.882 1.04 0.239 0.0361 3 0.896 1.04 0.0207 0.0140 4 0.897 1.03 0.163 0.0150 > head(data) cid rugged_std 1 1 -0.200000000 2 1 -0.151724138 3 1 -0.103448276 4 1 -0.055172414 5 1 -0.006896552
需要根据公式 mu = a[cid] + b[cid]*rugged_std 生成第三个数据框,要求:
- 包含30列,每列对应一个
rugged_std值 - 包含100行,每行取自
params中a[cid]和b[cid]的参数组合(允许重复) - 每个
rugged_std值对应100个由参数组合计算得到的mu值
解决方案
以下是基于dplyr和tidyr的实现代码:
完整代码
library(dplyr) library(tidyr) # 加载用户提供的完整数据 data <- structure(list(cid = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), rugged_std = c(-0.2, -0.151724137931035, -0.103448275862069, -0.0551724137931034, -0.00689655172413794, 0.0413793103448276, 0.0896551724137931, 0.137931034482759, 0.186206896551724, 0.23448275862069, 0.282758620689655, 0.331034482758621, 0.379310344827586, 0.427586206896552, 0.475862068965517, 0.524137931034483, 0.572413793103448, 0.620689655172414, 0.668965517241379, 0.717241379310345, 0.76551724137931, 0.813793103448276, 0.862068965517241, 0.910344827586207, 0.958620689655173, 1.00689655172414, 1.0551724137931, 1.10344827586207, 1.15172413793103, 1.2)), class = "data.frame", row.names = c(NA, -30L)) params <- structure(list(`a[1]` = c(0.910836, 0.882068, 0.896156, 0.896902, 0.871198, 0.890379, 0.873814, 0.867861, 0.888607, 0.887889, 0.90401, 0.904002, 0.863041, 0.902914, 0.866706, 0.87441, 0.908609, 0.899593, 0.868457, 0.870945, 0.892223, 0.905765, 0.892793, 0.88536, 0.869485, 0.892779, 0.923214, 0.879923, 0.896627, 0.856263), `a[2]` = c(1.05786, 1.04465, 1.04209, 1.03482, 1.04724, 1.04936, 1.06329, 1.05086, 1.0525, 1.03906, 1.05075, 1.04356, 1.03075, 1.04575, 1.04979, 1.04543, 1.02223, 1.02891, 1.04519, 1.02875, 1.06981, 1.03853, 1.04947, 1.04073, 1.05104, 1.05636, 1.0441, 1.04498, 1.0579, 1.0388), `b[1]` = c(0.239597, 0.239137, 0.0206942, 0.162874, 0.102635, 0.167029, 0.156862, -0.0605341, 0.076628, 0.125264, 0.251273, 0.221596, 0.126793, 0.0678483, 0.0885772, 0.0389816, 0.142527, 0.17842, 0.192263, 0.189756, 0.159639, 0.100018, 0.0579971, 0.0568845, 0.0689558, 0.180105, 0.126894, 0.00137584, 0.233685, 0.179266), `b[2]` = c(0.00332765, 0.0360513, 0.0140297, 0.0149716, 0.00192411, -0.000581532, 0.00138268, 0.0241489, 0.0251936, 0.0323527, 0.008488, 0.00979467, 0.00442379, 0.00860992, 0.0551994, 0.00498295, 0.0458311, 0.0333743, 0.00265565, 0.0124222, 0.0178482, 0.0284355, 0.0279484, 0.00664905, 0.0093533, 0.0236543, 0.00727722, 0.0296122, 0.00174974, 0.00184884)), row.names = c(NA, -30L), class = c("tbl_df", "tbl", "data.frame")) # 从params中抽取100组cid=1的参数(允许重复) params_sample <- params %>% select(`a[1]`, `b[1]`) %>% sample_n(100, replace = TRUE) %>% rename(a = `a[1]`, b = `b[1]`) %>% mutate(param_id = row_number()) # 计算所有参数组合与rugged_std对应的mu值,转换为宽格式 mu_wide <- params_sample %>% crossing(data %>% select(rugged_std)) %>% mutate(mu = a + b * rugged_std) %>% pivot_wider( id_cols = param_id, names_from = rugged_std, values_from = mu, names_prefix = "mu_" ) %>% select(-param_id) # 查看结果结构 str(mu_wide)
关键说明
- 若需处理
cid=2的场景,只需将select(a[1],b[1])替换为select(a[2],b[2])即可 names_prefix = "mu_"用于避免列名以数字开头,符合R的变量命名规范- 最终生成的
mu_wide数据框为100行×30列,完全符合需求
内容的提问来源于stack exchange,提问作者Filipe Dias
相关产品推荐
相关产品推荐

