重塑数据:从长到宽;多个变量,多个值
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 列保持不变,即 (Site
、Year
和 Day
),这意味着您总共得到了包含 90 列的结果 data2
。最后,每一行代表每个站点。
您好,感谢阅读....
这是我编辑后的数据集的一个小样本:
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 列保持不变,即 (Site
、Year
和 Day
),这意味着您总共得到了包含 90 列的结果 data2
。最后,每一行代表每个站点。