拆分数据框以创建新列
Splitting a data frame to create new columns
我有一个包含 "Count"、"Transect Number"、"Data" 和 "Year" 列的数据框。我的目
构建虚拟数据框:
Count1<-1:27
Count2<-1:30
Count3<-1:25
T1<-c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)
T2<-c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,1,2,2,2,2,3,3,3,3)
T3<-c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3)
Data1<-c(1,2,3,2,1,2,3,4,3,2,1,2,3,4,3,2,1,2,3,4,5,4,3,2,3,3,2)
Data2<-c(1,2,3,2,1,4,3,2,1,2,4,3,2,3,4,3,2,3,4,5,6,4,3,2,1,4,5,4,3,2)
Data3<-c(1,2,3,4,5,4,3,3,3,4,5,4,3,3,2,3,4,5,4,3,4,3,2,3,4)
Year1<-c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016)
Year2<-c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016)
Year3<-c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016)
DF1<-data.frame(Count1,T1,Data1,Year1)
colnames(DF1)<-c("Count","Transect","Data","Year")
DF2<-data.frame(Count2,T2,Data2,Year2)
colnames(DF2)<-c("Count","Transect","Data","Year")
DF3<-data.frame(Count3,T3,Data3,Year3)
colnames(DF3)<-c("Count","Transect","Data","Year")
All<-rbind(DF1,DF2,DF3)
一旦我有了数据框,我的想法就是按横断面拆分数据,因为这将是我正在进行的数据集的永久方面。
#Step 1-Break down by T
Trans1<-All[All$Transect==1,]
Trans2<-All[All$Transect==2,]
Trans3<-All[All$Transect==3,]
Trans4<-All[All$Transect==4,]
Trans5<-All[All$Transect==5,]
但我对下一步不太清楚。我需要从按年份组织的 "Data" 列中提取数据。像这样进一步分解数据:
Trans1_Year1<-Trans1[Trans1$Year==2014,]
Trans2_Year1<-Trans2[Trans2$Year==2014,]
Trans3_Year1<-Trans3[Trans3$Year==2014,]
Trans4_Year1<-Trans4[Trans4$Year==2014,]
Trans5_Year1<-Trans5[Trans5$Year==2014,]
甚至使用拆分
ByYear1<-split(Trans1,Trans1$Year)
但我宁愿避免写出上面的代码,因为我希望随着这个数据集的发展每年都添加新数据。我希望代码能够在添加时容纳新的 "Year" 数据,而不是每年编写新的代码行。
像这样设置数据后,我想创建第二个数据框,其中包含每年的列。一个问题是每年包含不同数量的行,这对我来说一直是个问题。但我的最终结果会有列:
"Transect", "Data 2014", "Data 2015", "Data 2016"
由于每年在一个样带内的行数可能不同,因此当每个样带的行数在年份之间不同时,我想在每个样带部分的末尾保留 NA。
我认为您是在将数据强制转换为一种自然不具备的格式。将其保留为 "long" 格式有很多处理优势。没看过的可以看看这篇文章,经典。
听起来您基本上是在尝试将数据转换为半宽格式,其中列数年,而不是保持 "long" 格式。
如果是这种情况,您最好添加一个显示 "Transect" 和 "Year" 的重复组合的二级索引列。
这可以使用我的 "splitstackshape" 包中的 getanID
轻松完成。 "splitstackshape" 还加载 "data.table",然后您可以从中使用 dcast.data.table
获得宽格式。
library(splitstackshape)
dcast.data.table(getanID(All, c("Transect", "Year")),
Transect + .id ~ Year, value.var = "Data")
# Transect .id 2014 2015 2016
# 1: 1 1 1 2 3
# 2: 1 2 2 1 4
# 3: 1 3 3 2 5
# 4: 1 4 1 2 4
# 5: 1 5 2 4 5
# 6: 1 6 3 3 6
# 7: 1 7 1 4 4
# 8: 1 8 2 5 4
# 9: 1 9 3 4 3
# 10: 1 10 NA NA 4
# 11: 2 1 2 3 4
# 12: 2 2 1 4 3
# 13: 2 3 2 3 2
# 14: 2 4 2 2 3
# 15: 2 5 1 3 2
# 16: 2 6 4 4 1
# 17: 2 7 4 3 4
# 18: 2 8 5 3 3
# 19: 2 9 4 2 2
# 20: 2 10 NA NA 3
# 21: 3 1 3 2 3
# 22: 3 2 4 1 3
# 23: 3 3 3 2 2
# 24: 3 4 3 3 5
# 25: 3 5 2 2 4
# 26: 3 6 1 3 3
# 27: 3 7 3 3 2
# 28: 3 8 3 4 4
# 29: 3 9 3 5 NA
# Transect .id 2014 2015 2016
然后,如果你真的想在 "Transect" 列上拆分,你可以继续使用 split
,但既然你现在有一个 "data.table",最好坚持并利用它的许多方便的功能,包括与子集和聚合相关的功能。
我有一个包含 "Count"、"Transect Number"、"Data" 和 "Year" 列的数据框。我的目
构建虚拟数据框:
Count1<-1:27
Count2<-1:30
Count3<-1:25
T1<-c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)
T2<-c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,1,2,2,2,2,3,3,3,3)
T3<-c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3)
Data1<-c(1,2,3,2,1,2,3,4,3,2,1,2,3,4,3,2,1,2,3,4,5,4,3,2,3,3,2)
Data2<-c(1,2,3,2,1,4,3,2,1,2,4,3,2,3,4,3,2,3,4,5,6,4,3,2,1,4,5,4,3,2)
Data3<-c(1,2,3,4,5,4,3,3,3,4,5,4,3,3,2,3,4,5,4,3,4,3,2,3,4)
Year1<-c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016)
Year2<-c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016)
Year3<-c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016)
DF1<-data.frame(Count1,T1,Data1,Year1)
colnames(DF1)<-c("Count","Transect","Data","Year")
DF2<-data.frame(Count2,T2,Data2,Year2)
colnames(DF2)<-c("Count","Transect","Data","Year")
DF3<-data.frame(Count3,T3,Data3,Year3)
colnames(DF3)<-c("Count","Transect","Data","Year")
All<-rbind(DF1,DF2,DF3)
一旦我有了数据框,我的想法就是按横断面拆分数据,因为这将是我正在进行的数据集的永久方面。
#Step 1-Break down by T
Trans1<-All[All$Transect==1,]
Trans2<-All[All$Transect==2,]
Trans3<-All[All$Transect==3,]
Trans4<-All[All$Transect==4,]
Trans5<-All[All$Transect==5,]
但我对下一步不太清楚。我需要从按年份组织的 "Data" 列中提取数据。像这样进一步分解数据:
Trans1_Year1<-Trans1[Trans1$Year==2014,]
Trans2_Year1<-Trans2[Trans2$Year==2014,]
Trans3_Year1<-Trans3[Trans3$Year==2014,]
Trans4_Year1<-Trans4[Trans4$Year==2014,]
Trans5_Year1<-Trans5[Trans5$Year==2014,]
甚至使用拆分
ByYear1<-split(Trans1,Trans1$Year)
但我宁愿避免写出上面的代码,因为我希望随着这个数据集的发展每年都添加新数据。我希望代码能够在添加时容纳新的 "Year" 数据,而不是每年编写新的代码行。
像这样设置数据后,我想创建第二个数据框,其中包含每年的列。一个问题是每年包含不同数量的行,这对我来说一直是个问题。但我的最终结果会有列:
"Transect", "Data 2014", "Data 2015", "Data 2016"
由于每年在一个样带内的行数可能不同,因此当每个样带的行数在年份之间不同时,我想在每个样带部分的末尾保留 NA。
我认为您是在将数据强制转换为一种自然不具备的格式。将其保留为 "long" 格式有很多处理优势。没看过的可以看看这篇文章,经典。
听起来您基本上是在尝试将数据转换为半宽格式,其中列数年,而不是保持 "long" 格式。
如果是这种情况,您最好添加一个显示 "Transect" 和 "Year" 的重复组合的二级索引列。
这可以使用我的 "splitstackshape" 包中的 getanID
轻松完成。 "splitstackshape" 还加载 "data.table",然后您可以从中使用 dcast.data.table
获得宽格式。
library(splitstackshape)
dcast.data.table(getanID(All, c("Transect", "Year")),
Transect + .id ~ Year, value.var = "Data")
# Transect .id 2014 2015 2016
# 1: 1 1 1 2 3
# 2: 1 2 2 1 4
# 3: 1 3 3 2 5
# 4: 1 4 1 2 4
# 5: 1 5 2 4 5
# 6: 1 6 3 3 6
# 7: 1 7 1 4 4
# 8: 1 8 2 5 4
# 9: 1 9 3 4 3
# 10: 1 10 NA NA 4
# 11: 2 1 2 3 4
# 12: 2 2 1 4 3
# 13: 2 3 2 3 2
# 14: 2 4 2 2 3
# 15: 2 5 1 3 2
# 16: 2 6 4 4 1
# 17: 2 7 4 3 4
# 18: 2 8 5 3 3
# 19: 2 9 4 2 2
# 20: 2 10 NA NA 3
# 21: 3 1 3 2 3
# 22: 3 2 4 1 3
# 23: 3 3 3 2 2
# 24: 3 4 3 3 5
# 25: 3 5 2 2 4
# 26: 3 6 1 3 3
# 27: 3 7 3 3 2
# 28: 3 8 3 4 4
# 29: 3 9 3 5 NA
# Transect .id 2014 2015 2016
然后,如果你真的想在 "Transect" 列上拆分,你可以继续使用 split
,但既然你现在有一个 "data.table",最好坚持并利用它的许多方便的功能,包括与子集和聚合相关的功能。