如何用tidyr将含预测值与置信区间的单行数据框重塑?
解决方法:用
pivot_longer结合正则重塑数据 嘿,我懂你现在的困扰——你直接用pivot_longer得到了每行对应一个原列的长格式,但这并不是你想要的结果。我们需要把带不同前缀的列(prob.、L.prob.、U.prob.)对应到每个度假类型的三个字段(预测值、置信下限、置信上限)。下面是一步到位的解决方案:
完整代码实现
library(tidyverse) # 你的原始数据 prediction <- structure(list(prob.no_vacation = 0.117514519600163, prob.camping = 0.143492608263017, prob.day_trip = 0.111421926419948, prob.hotel = 0.317703454494376, prob.other = 0.046127755158774, prob.zimmer = 0.263739736063722, L.prob.no_vacation = 0.0862080033692849, L.prob.camping = 0.108591033069218, L.prob.day_trip = 0.0824426383991041, L.prob.hotel = 0.269819723528852, L.prob.other = 0.0280805399319794, L.prob.zimmer = 0.21869871196767, U.prob.no_vacation = 0.158221505149101, U.prob.camping = 0.187255261510882, U.prob.day_trip = 0.148934253891266, U.prob.hotel = 0.369781447354612, U.prob.other = 0.0748802031049477, U.prob.zimmer = 0.314325057616515), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame")) # 核心重塑步骤 prediction_long <- prediction %>% pivot_longer( cols = everything(), # 选中所有列,无需手动指定范围 names_to = c(".value", "vacation_type"), # 拆分列名为「值类型」和「度假类型」 names_pattern = "(.*\\.)prob\\.(.*)" # 正则表达式匹配列名结构 ) %>% rename( estimate = prob., # 把默认的prob.列名改成更直观的estimate lower_ci = L.prob., # 重命名置信下限列 upper_ci = U.prob. # 重命名置信上限列 ) # 查看最终结果 print(prediction_long)
代码解释
cols = everything():自动选中所有列,避免手动列名范围出错,更灵活。names_to = c(".value", "vacation_type"):.value是pivot_longer的特殊参数,表示将列名中匹配的部分作为新的列名(比如prob.、L.prob.会变成后续的列)。vacation_type用来存储从列名中提取的度假类型(如no_vacation、camping)。
names_pattern = "(.*\\.)prob\\.(.*)":正则表达式的作用是拆分原列名:(.*\\.):匹配前缀部分(prob.、L.prob.、U.prob.),\\.是转义的点号(因为正则中点号代表任意字符)。prob\\.:固定的分隔符,用来区分前缀和度假类型。(.*):匹配后续的度假类型名称。
rename():把自动生成的列名改成更符合业务逻辑的名称,方便后续分析。
最终输出结果
执行代码后,你会得到如下格式的数据:
# A tibble: 6 × 4 vacation_type estimate lower_ci upper_ci <chr> <dbl> <dbl> <dbl> 1 no_vacation 0.118 0.0862 0.158 2 camping 0.143 0.109 0.187 3 day_trip 0.111 0.0824 0.149 4 hotel 0.318 0.270 0.370 5 other 0.0461 0.0281 0.0749 6 zimmer 0.264 0.219 0.314
这样就完美实现了你的需求:每行对应一个度假类型,同时保留预测值、置信区间上下限三个独立列。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

