一个很常见但是很难找到有具体步骤的解决方法的问题。。
以下是个人做法,不一定最高效最简单,欢迎讨论。
适用情况:
当excel表格的第一列有分类名称,导致dataframe不能被直接使用时,如何把p1转换成p2?
第一步:去除第一行分类名
代码:
names(dat) <- as.matrix(dat[1, ])
dat <- dat[-1, ]
dat[] <- lapply(dat, function(x) type.convert(as.character(x)))
此部分代码原帖地址:https://stackoverflow.com/questions/23209330/how-to-change-the-first-row-to-be-the-header-in-r
这一步之后,原本的'soft corals'这一行被去掉了,dataframe变成了常见的样子:
接下来要做的就是把这个分类名称做成一个attribute column放入dataframe。
现在的df里面所有不同种类的corals全部放在了一起,导致无法全部用一列的attribute去正确的分类。
所以我接下来把它们按种类放进不同的dataframe。因为种类这行已经统一删了,所以我是手动根据年份放的。
为了方便merge,做了如下这样一个root df,每一个分出来的coral df都会跟它拼在一起。
代码:
rootdf <- dat[c(1:8),c(1:3)]
分出小的coral df的代码跟它类似。
接下来要分别跟每一个小的coral df加上相对的分类attribute。
代码:
bc <-c('blue corals','blue corals','blue corals', 'blue corals', 'blue corals','blue corals','blue corals','blue corals' )
bcdf$coral <- bc
这里'coral'是我新的attribute的名字,‘bcdf’是小的coral df的名字。
对每一个分类都做完添加相应的attribute以后,把它们分别和root df merge起来。
横向合并代码:
sc1<-merge(rootdf,scdf,by="id")
每个都横向合并完就可以全部纵向合并变成一个大的、包括了全部信息的、有coral type attribute的数据集,长下图这个样子。
有了这些columns完全一样的小数据集后,就可以把它们全部纵向合并汇集到一个大数据集里面。
纵向合并的代码:
total<-rbind(sc1,sf1)
total<-rbind(total,bc1)
其中sc1,sf1,bc1,都是添加分类后的数据集的名字。
此时数据集长这样:
到这里,coral的分类已经全部清理完毕。当然目前这个数据集还没有达到最适合的状态,年份也应该被分成attribute,这篇先不具体说明。