使用dplyr和tidyr生成更复杂的表

使用dplyr和tidyr生成更复杂的表,r,dplyr,reshape,R,Dplyr,Reshape,我有一个看起来像这样的数据集,尽管真实的例子有更多的列。(目前)只有一排 我原以为有一种简单的方法可以做到这一点,也许可以使用类似于tidyr的separate命令,但我绞尽脑汁,搜索了SO,搜索了更广泛的web,并查看了tidyr文档,都没有用。我认为答案应该是显而易见的,但我看不出来 我将非常感谢您的帮助。您需要收集所有列,将这些名称分离成所需的相关部分,然后将数据分散成广泛的形式: library(tidyverse) Results %>% gather(var, val,

我有一个看起来像这样的数据集,尽管真实的例子有更多的列。(目前)只有一排

我原以为有一种简单的方法可以做到这一点,也许可以使用类似于tidyr的separate命令,但我绞尽脑汁,搜索了SO,搜索了更广泛的web,并查看了tidyr文档,都没有用。我认为答案应该是显而易见的,但我看不出来


我将非常感谢您的帮助。

您需要
收集所有列,
将这些名称分离成所需的相关部分,然后
将数据分散成广泛的形式:

library(tidyverse)
Results %>% 
  gather(var, val, everything()) %>% 
  extract(var, into = c("var", "measure"), regex = "(.*)_(Min|Count)") %>% 
  spread(var, val)
# # A tibble: 2 x 8
#   measure NI_BOCA_CT PCV2_CT PPV_CT PPV2_CT PPV3_CT PPV4_CT SW_BOCA_CT
# *   <chr>      <dbl>   <dbl>  <dbl>   <dbl>   <dbl>   <dbl>      <dbl>
# 1   Count     695.00  695.00 695.00   695.0   695.0   695.0     695.00
# 2     Min      20.51    7.15  29.58    11.4     8.6    16.3      23.49
库(tidyverse)
结果%>%
聚集(var、val、everything())%>%
提取(var,into=c(“var”,“measure”),regex=“(.*)(Min | Count)”)%>%
价差(var,val)
##A tibble:2 x 8
#测量NI_BOCA_CT PCV2_CT PPV_CT PPV2_CT PPV3_CT PPV4_CT SW_BOCA_CT
# *                             
#1计数695.00 695.00 695.00 695.0 695.0 695.0 695.00
#2分钟20.51 7.15 29.58 11.4 8.6 16.3 23.49

要拆分的更通用的正则表达式可能是
regex=“(.*)_(.*)”
,如果您使用了多个其他汇总函数,这可能会很有用



我知道你有理由把你的数据放在这个表格里,但这和你应该看到的有点相反。理想情况下,让您的列包含所有相同类型度量值的数据更为合理……

使用基本R/
重塑2的两种不同想法可能是:

拆分和堆叠:

dfs <- lapply(c("Min", "Count"), function(x) {
        res <- Results[, grepl(x, names(Results))]
        res <- setNames(res, gsub(paste0("_", x), "", names(res)))
        res$measure <- x
        return(res)
      })
do.call(rbind, dfs)

# A tibble: 2 x 8
#  PCV2_CT PPV2_CT PPV3_CT PPV4_CT PPV_CT NI_BOCA_CT SW_BOCA_CT measure
#    <dbl>   <dbl>   <dbl>   <dbl>  <dbl>      <dbl>      <dbl>   <chr>
#1    7.15    11.4     8.6    16.3  29.58      20.51      23.49     Min
#2  695.00   695.0   695.0   695.0 695.00     695.00     695.00   Count
library(reshape2)
melted <- melt(data.frame(Results))
melted$measure <- gsub(".*_(Min|Count)", "\\1", melted$variable)
melted$variable <- gsub("_(Min|Count)", "", melted$variable)
dcast(melted, measure ~ variable)

#  measure NI_BOCA_CT PCV2_CT PPV_CT PPV2_CT PPV3_CT PPV4_CT SW_BOCA_CT
#1   Count     695.00  695.00 695.00   695.0   695.0   695.0     695.00
#2     Min      20.51    7.15  29.58    11.4     8.6    16.3      23.49

dfs使用
tidyr::extract
tidyr::separate
有什么好处?数据杂乱无章,但在R中不容易的一个领域是生成这些类型的表,而这或它的一些变体似乎是最简单的方法。你的回答很有帮助,我会继续努力的。谢谢大家!@jdobres,
extract
将允许您指定不同的捕获组,而
separate
更像是一个
strsplit
到新列中。如果所有变量都有相同数量的下划线,只需使用
分隔符
就更容易了。
library(tidyverse)
Results %>% 
  gather(var, val, everything()) %>% 
  extract(var, into = c("var", "measure"), regex = "(.*)_(Min|Count)") %>% 
  spread(var, val)
# # A tibble: 2 x 8
#   measure NI_BOCA_CT PCV2_CT PPV_CT PPV2_CT PPV3_CT PPV4_CT SW_BOCA_CT
# *   <chr>      <dbl>   <dbl>  <dbl>   <dbl>   <dbl>   <dbl>      <dbl>
# 1   Count     695.00  695.00 695.00   695.0   695.0   695.0     695.00
# 2     Min      20.51    7.15  29.58    11.4     8.6    16.3      23.49
dfs <- lapply(c("Min", "Count"), function(x) {
        res <- Results[, grepl(x, names(Results))]
        res <- setNames(res, gsub(paste0("_", x), "", names(res)))
        res$measure <- x
        return(res)
      })
do.call(rbind, dfs)

# A tibble: 2 x 8
#  PCV2_CT PPV2_CT PPV3_CT PPV4_CT PPV_CT NI_BOCA_CT SW_BOCA_CT measure
#    <dbl>   <dbl>   <dbl>   <dbl>  <dbl>      <dbl>      <dbl>   <chr>
#1    7.15    11.4     8.6    16.3  29.58      20.51      23.49     Min
#2  695.00   695.0   695.0   695.0 695.00     695.00     695.00   Count
library(reshape2)
melted <- melt(data.frame(Results))
melted$measure <- gsub(".*_(Min|Count)", "\\1", melted$variable)
melted$variable <- gsub("_(Min|Count)", "", melted$variable)
dcast(melted, measure ~ variable)

#  measure NI_BOCA_CT PCV2_CT PPV_CT PPV2_CT PPV3_CT PPV4_CT SW_BOCA_CT
#1   Count     695.00  695.00 695.00   695.0   695.0   695.0     695.00
#2     Min      20.51    7.15  29.58    11.4     8.6    16.3      23.49