R语言按列号提取数据框列名时重复列名带.1后缀的原因
问题原因
该现象是R数据框的强制列名唯一机制触发导致的,和写法逻辑错误直接相关:
- R中
data.frame对象不允许存在重复列名,当使用带重复值的索引子集数据框列时,R会自动调用make.unique()处理重名:第一次出现的列名保留原名,后续重复出现的同名列会被依次追加.1、.2后缀,保证子数据框列名唯一。 - 你的代码中
df[doi$colum]这一步传入的列索引为c(3,5,4,7,2,2,1),其中列索引2重复出现2次。子集过程中第一个匹配到的列2(列名Apple)保留原名,第二个重复的列2被自动重命名为Apple.1,后续你通过colnames()取这个子数据框的列名,拿到的自然是带后缀的修改后结果。
本质问题:你仅需要按位置提取列名,完全不需要先子集整个数据框。
colnames(df)本身是存储所有原始列名的字符向量,直接对向量做位置索引不会触发任何重命名逻辑。
修正方案
直接对列名字符向量做位置索引即可,不会出现自动追加后缀的问题,代码如下:
data.frame( Index = df[doi$row, 1], Fruits = colnames(df)[doi$colum] )
运行后Fruits列会正确返回所有位置对应的原始列名,重复位置也会正确输出Apple而非Apple.1。
内容的提问来源于stack exchange,提问作者thentangler
相关产品推荐
相关产品推荐

