You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:09:24