在 R 中旋转更长的时间

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到每个变量的末尾,以便在数据透视时将它们识别为一个集合:

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

  • 哦,太狡猾了,我从来没有在 `names_to=` 中尝试过 `NA` ...我必须进一步研究一下 (5认同)
  • 你实际上不需要 NA, `names_pattern = ".*_(.*)", names_to = ".value"` 就足够了,即定义一组 (3认同)

r2e*_*ans 7

我不认为这可以通过一步完成(编辑:因为使用@RitcheSacramento\'s(lotus\'s?)优秀答案进行了纠正),所以我们将双重旋转它。不确定您是否需要qcode(我的名字)栏,我保留它以防万一。

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n


asd*_*-tm 6

实际上根据给定的数据为什么不简单地:

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)