使用Gather功能进行R数据整理

时间:2020-05-22 13:26:40

标签: r

我正在将多个数据集组合为一个更清洁的数据集的漫长过程。有站点信息,参数信息,结果和质量控制值。我的目标是使数据具有以下基本格式:

Site_Info  Date     Parameter     Result   QC_value
K1          1/1/12     Aluminum    14.2       NA
K1          1/1/12     TKN         27.8       B3
K8          2/1/18     Iron        0.001      Calc

我输入的一个数据集非常宽,每个参数/结果和QC值都有一列,总共168列。格式与此类似

Site Info  Date      Aluminum  Aluminum_QC    Iron    Iron_QC  TKN    TKN_QC
K1          1/1/12     14.2      NA            NA       NA      27.8  B3
K8          2/1/18     NA        NA            0.001    Calc    NA    NA

到目前为止,我已经能够使用collect函数来获取接近我想要的数据集。所有的参数和结果列都是应有的,但是相关的QC列存在问题。

# site info and QC columns to be excluded from gather
ltrm_qual<-c(1:7,10,12,15,17,19,21,23:51,53,55,57,59,61,63,65:76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122:125,127)

LTRM<-gather(LTRM, Parameter, Result, -ltrm_qual)

这将导致类似于此结构的数据集。 QC列均被分隔,并且与站点信息相似。

Site_Info  Date      Parameter     Result     Aluminum_QC  Iron_QC  TKN_QC
K1          1/1/12     Aluminum     14.2      NA            NA        B3
K1          1/1/12     TKN          27.8      NA            NA        B3
K8          2/1/18     Iron         0.001     NA            Calc      NA

我想将QC列正确地合并为参数所标识的一列。我知道我可以使用此结果通过使用参数查询QC列来获得一个统一的QC列。但是,我确定有更好的方法。

2 个答案:

答案 0 :(得分:2)

这里是tidyverse的答案...

data-bind="attr: { style: 'background-color: ' + BackColor() + '; background-image: none' }"

...以及输出:

textFile <- "SiteInfo  Date      Aluminum  Aluminum_QC    Iron    Iron_QC  TKN    TKN_QC
K1          1/1/12     14.2      NA            NA       NA      27.8  B3
K8          2/1/18     NA        NA            0.001    Calc    NA    NA"

data <- read.table(text = textFile,header = TRUE,stringsAsFactors = FALSE)

library(tidyr)
library(dplyr)
narrowMeasures <- data %>% group_by(SiteInfo,Date) %>% 
     select(-contains("_QC")) %>%
     pivot_longer(.,-c(SiteInfo,Date),names_to = "Measure",values_to = "Result")

# pivot the QC data and join with the metals measurements 
data %>% group_by(SiteInfo,Date) %>% 
     select(SiteInfo,Date,contains("_QC")) %>%
     pivot_longer(.,-c(SiteInfo,Date),names_to = "Measure",values_to = "QC_value") %>%
     mutate(Measure = sub("_QC","",Measure)) %>%
     inner_join(.,narrowMeasures)

我们可以通过在第二个管道的末尾添加# A tibble: 6 x 5 # Groups: SiteInfo, Date [2] SiteInfo Date Measure QC_value Result <chr> <chr> <chr> <chr> <dbl> 1 K1 1/1/12 Aluminum NA 14.2 2 K1 1/1/12 Iron NA NA 3 K1 1/1/12 TKN B3 27.8 4 K8 2/1/18 Aluminum NA NA 5 K8 2/1/18 Iron Calc 0.001 6 K8 2/1/18 TKN NA NA > 来删除Result和QC_value均为NA的行,如下所示。

filter()

...以及最终输出:

 %>% filter(!(is.na(QC_value) & is.na(Result)))

答案 1 :(得分:1)

喜欢这个吗?:

df %>% 
  pivot_longer(cols = c(5:7), names_to = c("QC"), values_drop_na = TRUE)

# A tibble: 3 x 6
  Site_Info Date       Parameter Result QC      value
  <chr>     <chr>      <chr>      <dbl> <chr>   <chr>
1 K1        01.01.2012 Aluminium 14.2   TKN_QC  B3   
2 K1        01.01.2012 TKN       27.8   TKN_QC  B3   
3 K8        02.01.2018 Iron       0.001 Iron_QC Calc