R:用行值替换列名,除非单元格等于NA

时间:2014-08-09 11:48:27

标签: r

我有一个从包含不同类型数据(记录类型)的数据库中提取的数据帧。不同的记录类型具有不同的列名称,占据前三行(包括标题)。此数据框用于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的所有列不是一个选项。这是我试图解决这个问题的方式,但我无法弄清楚如何。

我希望这是帮助我并感谢所需的所有信息!

2 个答案:

答案 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])