R 拆分数据框以创建新列

R 拆分数据框以创建新列,r,split,dataframe,R,Split,Dataframe,我有一个数据框,其中有“计数”、“横断面数”、“数据”和“年份”列。我的目标是将数据框按横断面拆分,然后再按年份拆分,并创建一个新的数据框,其中包含一列“横断面”,然后在以下列中列出每年的相应数据 要构建虚拟数据帧,请执行以下操作: 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,

我有一个数据框,其中有“计数”、“横断面数”、“数据”和“年份”列。我的目标是将数据框按横断面拆分,然后再按年份拆分,并创建一个新的数据框,其中包含一列“横断面”,然后在以下列中列出每年的相应数据

要构建虚拟数据帧,请执行以下操作:

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)

由于每年在一个样带内可以有不同的行数,我想在每个样带的末尾留下NA,当每个样带的行数在不同年份之间不同时

我认为你是在强迫你的数据采用一种它自然不具备的格式。将其保留为“长”格式有很多处理优势。看一看这篇文章,如果你还没有看到它,它是一个经典


听起来,您基本上是在尝试将数据转换为半宽格式,其中包含多年的列,而不是将其保留为“长”格式

如果是这种情况,最好添加一个二级索引列,显示“横断面”和“年份”的重复组合

这可以通过我的“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

然后,如果您真的想在“横断面”列上进行拆分,您可以继续使用
split
,但既然您现在有了“data.table”,最好还是坚持使用它,并利用它的许多方便功能,包括与子集和聚合相关的功能

我同意长格式通常更好,我将保留长格式,以便根据这些数据绘制绘图。但是出于各种原因,我希望像上面提到的那样设置我的数据。因此,将其保存为长格式以供存储,然后在需要时将其放入一个包含代码的宽表中,这不是更有意义吗?或者这是你的意图?@MikeWise,听起来他们已经有了长格式的数据,只需要做一些额外的工作就可以了。(换句话说,是的,听起来这就是他们的意图。)
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)
 "Transect", "Data 2014", "Data 2015", "Data 2016"
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