【问题标题】:Pivot data from wide to long using column suffix to get table with multiple columns with values (using pivot_longer)使用列后缀将数据从宽转长以获取具有多列值的表(使用 pivot_longer)
【发布时间】:2019-11-15 15:13:58
【问题描述】:

我有一个看起来像这样的小标题/数据框:

hc_inpatient_sum hc_ambulant_sum hc_inpatient_mean hc_ambulant_mean
5                2               5.5              2.2

我想要的输出是:

my_names       sum  mean
hc_inpatient     5   5.5
hc_ambulant      2   2.2

我使用下面的代码得到了我想要的东西。然而,它似乎相当复杂。我猜想用不太复杂的代码也能得到同样的结果。

library(dplyr)
library(tidyr)

my_data <- tibble(hc_inpatient_sum = 5, hc_ambulant_sum = 2, hc_inpatient_mean = 5.5, 
hc_ambulant_mean = 2.2)

res <- my_data %>% 
  pivot_longer(cols = everything(), names_to = "my_names", values_to = "my_values") %>% 
  separate(my_names, into = c("my_names", "stats"), sep = "_(?=[^_]+$)") %>% 
  pivot_wider(names_from = "stats", values_from = "my_values")

有没有更直接的方法可以使用 tidyr::pivot_longer 获得相同的结果?

或者我可以做这样的事情......

res2 <- pivot_longer(my_data, cols = everything(),
             names_to = c(".value", "stats"), 
             names_pattern = "(.*)_(.*)") %>% 
  t()

colnames(res2) <- res2["stats",]

res2 <- as_tibble(res2[-1,], rownames = "my_names") %>% 
  mutate_at(vars(-my_names), as.double)

...不过这样更尴尬。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    您可以与...合二为一

    df %>% pivot_longer(everything(), 
                        names_to = c("my_names", ".value"), 
                        names_pattern = "(.+)_(.+$)")
    
      my_names       sum  mean
      <chr>        <int> <dbl>
    1 hc_inpatient     5   5.5
    2 hc_ambulant      2   2.2
    

    这些示例对于掌握 pivot_longer https://tidyr.tidyverse.org/reference/pivot_longer.html 的窍门非常有帮助

    【讨论】:

    • 您的解决方案完美运行。我查看了这些示例,但对 names_pattern 参数感到不知所措。你能快速解释一下“(.+)_(.+$)”匹配什么吗?
    • @Roccer 这是正则表达式。两个捕获的组在(括号)中 - 它们对应于 my_names.value 新列名。第一组捕获_ 之前的任何字符串,第二组是_ 之后的字符串,包括行尾$。我同意这可能很难遵循 - 有几个很好的指南,比如这里:rexegg.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2018-06-24
    • 2023-03-13
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多