Chl*_*_pa 7 pivot r dplyr tidyr
这是我的输入数据集,其中包含一行和 12 列/变量:
df <- data.frame(q_q10=0,q_q20=0, q_q30=0,q_q40=400,
q_q10_low=0,q_q20_low=0,q_q30_low=0,q_q40_low=350,
q_q10_up=24,q_q20_up=24,q_q30_up=24,q_q40_up=500)
Run Code Online (Sandbox Code Playgroud)
我想重塑 df ,以便得到一个包含 4 行和 3 个变量(分位数、下、上)的数据框。换句话说,我希望 df2 看起来像:
data.frame(quantile=c(0,0,0,400), low=c(0,0,0,350), up=c(24,24,24,500))
Run Code Online (Sandbox Code Playgroud)
我如何使用包pivot_longer()中的功能来做到这一点tidyr?
谢谢!!
H 1*_*H 1 11
如果您重命名分位数变量,则可以在单个数据透视中执行此操作,在这种情况下,我们将添加_quantile到每个变量的末尾,以便在数据透视时将它们识别为一个集合:
library(dplyr)\nlibrary(tidyr)\n\ndf |>\n rename_with(.fn = ~ paste0(.x, "_quantile"), ends_with("0")) |>\n pivot_longer(everything(), names_pattern = ".*_(.*)", names_to = ".value")\n\n# A tibble: 4 \xc3\x97 3\n quantile low up\n <dbl> <dbl> <dbl>\n1 0 0 24\n2 0 0 24\n3 0 0 24\n4 400 350 500\nRun Code Online (Sandbox Code Playgroud)\n
我不认为这可以通过一步完成(编辑:因为使用@RitcheSacramento\'s(lotus\'s?)优秀答案进行了纠正),所以我们将双重旋转它。不确定您是否需要qcode(我的名字)栏,我保留它以防万一。
library(dplyr)\nlibrary(tidyr)\npivot_longer(df, cols = everything(), names_pattern = "q_([^_]*)(_.*)?", names_to = c("qcode", "lowup")) %>%\n mutate(lowup = if_else(nzchar(lowup), sub("^_", "", lowup), "quantile")) %>%\n pivot_wider(id_cols = qcode, names_from = lowup, values_from = value)\n# # A tibble: 4 \xc3\x97 4\n# qcode quantile low up\n# <chr> <dbl> <dbl> <dbl>\n# 1 q10 0 0 24\n# 2 q20 0 0 24\n# 3 q30 0 0 24\n# 4 q40 400 350 500\nRun Code Online (Sandbox Code Playgroud)\n
实际上根据给定的数据为什么不简单地:
matrix(df, ncol = 3) |>
`colnames<-`(c("quantile", "low", "up"))
Run Code Online (Sandbox Code Playgroud)
甚至感谢@jpsmith 的一句话:
matrix(df, ncol = 3, dimnames = list(NULL, c("quantile", "low", "up")))
quantile low up
[1,] 0 0 24
[2,] 0 0 24
[3,] 0 0 24
[4,] 400 350 500
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |