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