我有一个从包含不同类型数据(记录类型)的数据库中提取的数据帧。不同的记录类型具有不同的列名称,占据前三行(包括标题)。此数据框用于excel,您可以通过选择正确的记录类型轻松过滤掉数据。
这里我提供了我的数据框的小样本,实际上包含更多列(59)和行(34000)。
sample <- data.frame(X01RecordType=c("01HL","01CA","HH","HH","HH","HL"), X02Quarter=c(NA,NA,2,2,2,1),X05Gear=c(NA,NA,"KRA","KRA","KRA",NA),X06SweepLngt=c(NA,NA,35,35,-9,-9),
X12Month=c("12SpecCodeType",NA,4,5,4,2), X13Day=c("13SpecCode",NA,26,5,25,160617), X22StatRec=c("22LngtCode","22CANoAtLngt","45G1",NA,NA,NA),X23Depth=c("23LngtClass","23IndWgt",41,NA,63,NA))
正如您可能会看到包含列名称的单元格前面有一个X和一个数字,然后是一个文本,例如X01RecordType。使用以下命令将列名替换为第一行非常容易:
colnames(df) <- df[1,]
但是,正如您所看到的,前两行中的一些单元格也包含NA值。这些NA值表示所有记录类型的列名相同,使用当前标头,因此我想保留这些。所以我真正想做的是用第一行的值替换列名(其中记录类型标题等于01HL),NA值除外。
如果可能的话,我想在不使用任何外部包的情况下这样做。数据中的单元格也可能包含NA值,我想保留这些行,因此如果它不仅适用于第一行,则过滤掉包含NA的所有列不是一个选项。这是我试图解决这个问题的方式,但我无法弄清楚如何。
我希望这是帮助我并感谢所需的所有信息!
答案 0 :(得分:3)
没有循环的另一个选项
colnames(sample)[!is.na(sample[1,])] <- sample[1,][!is.na(sample[1,])]
sample[1:2,]
# 01HL X02Quarter X05Gear X06SweepLngt 12SpecCodeType 13SpecCode 22LngtCode
#1 01HL NA <NA> NA 12SpecCodeType 13SpecCode 22LngtCode
#2 01CA NA <NA> NA <NA> <NA> 22CANoAtLngt
# 23LngtClass
#1 23LngtClass
#2 23IndWgt
答案 1 :(得分:1)
我建议一个简单的循环:
for(c in 1:length(sample)) if(!is.na(sample[1,c])) colnames(sample)[c] = as.character(sample[1,c])