r - 使用 dplyr 和 tidyr 制作更复杂的表

标签 r dplyr reshape

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

Results <- structure(list(PCV2_CT_Min = 7.15, PPV2_CT_Min = 11.4, PPV3_CT_Min = 8.6, 
PPV4_CT_Min = 16.3, PPV_CT_Min = 29.58, NI_BOCA_CT_Min = 20.51, 
SW_BOCA_CT_Min = 23.49, PCV2_CT_Count = 695L, PPV2_CT_Count = 695L, 
PPV3_CT_Count = 695L, PPV4_CT_Count = 695L, PPV_CT_Count = 695L, 
NI_BOCA_CT_Count = 695L, SW_BOCA_CT_Count = 695L),
.Names = c("PCV2_CT_Min", "PPV2_CT_Min", "PPV3_CT_Min", "PPV4_CT_Min", "PPV_CT_Min", "NI_BOCA_CT_Min", "SW_BOCA_CT_Min", "PCV2_CT_Count", "PPV2_CT_Count", "PPV3_CT_Count", "PPV4_CT_Count", "PPV_CT_Count", "NI_BOCA_CT_Count", "SW_BOCA_CT_Count"),
row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"))

每个列名都由变量名和函数名组成,因此 PCV2_CT_Min 是 PCV2 病毒测试的最小计数 (CT); PCV_CT_Count 是测试的动物总数,依此类推。

它是通过在另一个数据集上运行来自 dplyrsummarize_all 来制作的,该数据集是对 pig 进行单独病毒测试,使用此代码的更长版本:-

V <- Pig %>%
     select(ends_with('CT')) %>% 
     summarise_all(funs(Min = min(.,na.rm=TRUE),
     Count = n()))

在实际示例中,有更多的函数,并且它们采用不同的参数。我最终想要得到的是这样的数据框:-

Parameter PCV_CT PPV2_CT PPV3_CT PPV4_CT PPV_CT NI_BOCA_CT SW_BOCA_CT
Min       7.15   11.4    8.6     16.3    29.58  20.51     23.49
Count     695    695     695     695     695    695       695 

我原以为有一种简单的方法可以做到这一点,也许使用类似于 tidyr单独 命令之类的东西,但我绞尽脑汁,搜索了所以,并且更广泛的网络,并查看了 tidyr 文档,但都无济于事。我想答案应该是显而易见的,但我看不到。

如果有任何帮助,我将不胜感激。

最佳答案

您需要gather所有列,separate将名称写入您想要的相关部分,然后 spread将数据恢复为宽格式:

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

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


我知道您有理由以这种形式保存数据,但这与您实际应该查看的内容有点相反。理想情况下,让您的列包含所有相同类型度量的数据更有意义......

关于r - 使用 dplyr 和 tidyr 制作更复杂的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926670/

相关文章:

r - 更改密度直方图的 binwidth 以使概率总和为 1

关于两个向量的差、交和并

r - map_dfr 输出一行而不是一列

r - dplyr:变异内的整数采样

在 R 中使用 dplyr reshape 表格

python - reshape Pandas 列以显示图像

r - 如何将行数据拆分到其他行下方

R Shiny : Can't access reactive value outside of reactive consumer

r - 更改 R 中过滤后的 data.frame 中一列中的所有值

pandas - 重新排列数据框尺寸