我正在将多个数据集组合为一个更清洁的数据集的漫长过程。有站点信息,参数信息,结果和质量控制值。我的目标是使数据具有以下基本格式:
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列。但是,我确定有更好的方法。
答案 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