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

时间:2018-01-11 03:18:27

标签: r reshape tidyr

嗨,谢谢你的阅读......

以下是编辑后我的数据集的一小部分示例:

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格式。我加入了重铸,dcast,reshape,reshape2,cbind,combine..etc。我很喜欢重铸,但远不是一个有用的数据集。

从上面的数据框中,我想实现这样的目标:

在此处查看图片链接*

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

目前,1 SITE的数据分布在多行中。我希望每一个SITE的所有数据都在一行中(即每个站点只在SITE列中出现一次。每个唯一的VARIABLE应该有一个列,以及相应的VALUE,ERROR和UNIT列,每个。我想大约有50个独特的VARIABLES,因此新数据框将有大约200个列。

我希望解释是充分的;但请不要犹豫要求澄清。

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

1 个答案:

答案 0 :(得分:0)

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

加载数据

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。最后,每行代表每个站点。