重塑数据:从长到宽;多个变量,多个值

Reshaping data: long to wide; multiple variables, multiple values

您好,感谢阅读....

这是我编辑后的数据集的一个小样本:

data <- read.table(text=
"Site  Year   Day           Variable     Value Error  Unit
1  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
1  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
2  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
2  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
3  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
3  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
4  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
4  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
5  2004   238  General-SolidsTSS 6.430e-01 1e-04  mg/L
5  2004   238  Phosphorus-OrthoP 3.000e-03 1e-04  mg/L
5  2004   238      Phosphorus-TP 4.000e-03 1e-04  mg/L
5  2004   238        Nitrogen-TN 5.000e-02 1e-03  mg/L
5  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
5  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
5  2004   238 General-Alkalinity 6.500e+01 1e-02  mg/L
6  2004   237 General-Alkalinity 5.540e+01 1e-03  mg/L
6  2004   237  General-SolidsTSS 1.292e+01 1e-03  mg/L
6  2004   237       Nitrogen-NO2 2.000e-03 1e-03  mg/L
6  2004   237       Nitrogen-NO3 2.200e-02 1e-03  mg/L
6  2004   237       Nitrogen-TDN 9.000e-02 1e-03  mg/L
6  2004   237     Phosphorus-TDP 4.000e-03 1e-03  mg/L
7  2004   238 General-Alkalinity 4.430e+01 1e-03  mg/L
7  2004   238  General-SolidsTSS 2.340e+00 1e-03  mg/L
7  2004   238   Nitrogen-NO2+NO3 4.800e-02 1e-03  mg/L
7  2004   238       Nitrogen-TDN 2.700e-01 1e-03  mg/L
7  2004   238     Phosphorus-TDP 6.000e-03 1e-03  mg/L
8  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
8  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
9  2010   194                 Ca 1.450e+02 1e-01  mg/L
9  2010   194 General-Alkalinity 2.150e+02 5e-01  mg/L
9  2010   194   General-Hardness 4.800e+02 4e-01  mg/L
9  2010   194                SO4 2.540e+02 1e+01  mg/L
9  2010   194                 Bi 5.000e-07 1e-06  mg/L
9  2010   194                 Sn 2.500e-06 5e-06  mg/L
9  2010   194       Nitrogen-NO2 2.500e-03 5e-03  mg/L
9  2010   194       Nitrogen-NO3 2.500e-03 5e-03  mg/L
9  2010   194                 Br 1.000e-02 2e-02  mg/L
9  2010   194                  U 2.670e-03 5e-07  mg/L
9  2010   194                 Ag 3.000e-06 1e-06  mg/L
9  2010   194                 Be 1.300e-05 1e-06  mg/L
9  2010   194                 Cd 5.400e-05 1e-06  mg/L
9  2010   194                 Sb 8.500e-05 1e-06  mg/L
9  2010   194                 Tl 1.700e-05 1e-06  mg/L
9  2010   194                 Co 1.250e-03 2e-06  mg/L
9  2010   194                 Mo 1.510e-03 5e-06  mg/L
9  2010   194                 Pb 6.000e-05 5e-06  mg/L
9  2010   194                  V 3.860e-04 5e-06  mg/L
9  2010   194                 As 7.900e-04 1e-05  mg/L
9  2010   194                 Cr 1.600e-04 1e-05  mg/L
9  2010   194                 Li 3.230e-02 1e-05  mg/L", stringsAsFactors=F, header=T)

我需要将数据格式化为 WIDE 格式。我干预了 recast、dcast、reshape、reshape2、cbind、combine..等。我在重铸方面很幸运,但离有用的数据集还差得很远。

从上面的数据框,我想实现这样的事情:

请在此处查看link图像*

https://i.stack.imgur.com/YrO1U.jpg

目前,1 个 SITE 的数据分布在几行中。我希望每个站点的所有数据都在一行中(即每个站点只在站点列中出现一次。每个唯一的变量应该有一个列,以及每个对应的值、错误和单位列。即我认为大约有 50 个唯一变量,因此新数据框将有 ~ 200 多列。

我希望解释足够了;但不要犹豫,要求澄清。

我怀疑一些更有经验的用户给出了一个简单的答案。在此先感谢您的支持。干杯

您可以按如下方式重塑数据:

加载数据

data <- read.table(text=
"Site  Year   Day           Variable     Value Error  Unit
1  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
1  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
2  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
2  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
3  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
3  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
4  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
4  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
5  2004   238  General-SolidsTSS 6.430e-01 1e-04  mg/L
5  2004   238  Phosphorus-OrthoP 3.000e-03 1e-04  mg/L
5  2004   238      Phosphorus-TP 4.000e-03 1e-04  mg/L
5  2004   238        Nitrogen-TN 5.000e-02 1e-03  mg/L
5  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
5  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
5  2004   238 General-Alkalinity 6.500e+01 1e-02  mg/L
6  2004   237 General-Alkalinity 5.540e+01 1e-03  mg/L
6  2004   237  General-SolidsTSS 1.292e+01 1e-03  mg/L
6  2004   237       Nitrogen-NO2 2.000e-03 1e-03  mg/L
6  2004   237       Nitrogen-NO3 2.200e-02 1e-03  mg/L
6  2004   237       Nitrogen-TDN 9.000e-02 1e-03  mg/L
6  2004   237     Phosphorus-TDP 4.000e-03 1e-03  mg/L
7  2004   238 General-Alkalinity 4.430e+01 1e-03  mg/L
7  2004   238  General-SolidsTSS 2.340e+00 1e-03  mg/L
7  2004   238   Nitrogen-NO2+NO3 4.800e-02 1e-03  mg/L
7  2004   238       Nitrogen-TDN 2.700e-01 1e-03  mg/L
7  2004   238     Phosphorus-TDP 6.000e-03 1e-03  mg/L
8  2004   238       Nitrogen-NO3 1.000e-03 2e-03  mg/L
8  2004   238       Nitrogen-NO2 2.500e-03 5e-03  mg/L
9  2010   194                 Ca 1.450e+02 1e-01  mg/L
9  2010   194 General-Alkalinity 2.150e+02 5e-01  mg/L
9  2010   194   General-Hardness 4.800e+02 4e-01  mg/L
9  2010   194                SO4 2.540e+02 1e+01  mg/L
9  2010   194                 Bi 5.000e-07 1e-06  mg/L
9  2010   194                 Sn 2.500e-06 5e-06  mg/L
9  2010   194       Nitrogen-NO2 2.500e-03 5e-03  mg/L
9  2010   194       Nitrogen-NO3 2.500e-03 5e-03  mg/L
9  2010   194                 Br 1.000e-02 2e-02  mg/L
9  2010   194                  U 2.670e-03 5e-07  mg/L
9  2010   194                 Ag 3.000e-06 1e-06  mg/L
9  2010   194                 Be 1.300e-05 1e-06  mg/L
9  2010   194                 Cd 5.400e-05 1e-06  mg/L
9  2010   194                 Sb 8.500e-05 1e-06  mg/L
9  2010   194                 Tl 1.700e-05 1e-06  mg/L
9  2010   194                 Co 1.250e-03 2e-06  mg/L
9  2010   194                 Mo 1.510e-03 5e-06  mg/L
9  2010   194                 Pb 6.000e-05 5e-06  mg/L
9  2010   194                  V 3.860e-04 5e-06  mg/L
9  2010   194                 As 7.900e-04 1e-05  mg/L
9  2010   194                 Cr 1.600e-04 1e-05  mg/L
9  2010   194                 Li 3.230e-02 1e-05  mg/L", stringsAsFactors=F, header=T)

用data.table

投射
library(data.table)
data$Variable <- gsub("\+", "plus", data$Variable) #get rid of `+` for the sake of later pattern matching
setDT(data)
data2 <- dcast(data, Site+Year+Day~Variable, value.var = c("Value", "Error", "Unit"))

并对列重新排序

order_cols <- c()
for(i in unique(data$Variable)){
  order_cols <- append(order_cols, grep(paste0(i, "$"), names(data2)))
}
setcolorder(data2, c(1:3, order_cols))

在您的原始数据集 (data) 中,列 Variable 有 29 个唯一值。对于 Variable 的每个级别,都会生成 3 列(值、误差和单位),从而提供 87 列。转换后 3 列保持不变,即 (SiteYearDay),这意味着您总共得到了包含 90 列的结果 data2。最后,每一行代表每个站点。