• Create Time: 2022-03-03
  • Update Time: 2022-03-08

下划线不友好?

这是这两天Edwin问我的一个问题,我认为很简单,就直接给了答案,但是结果却和预期的不太一样。

Hi Logan! May I ask about how to prevent the R converting my duplicated column names into something like A.1 A.2 while original column names are A A

我的第一反应就是这个问题我之前见过,我会。

然后我就回了,就是读取数据的时候,比如用read.table,里面有一个参数叫check.names,把它设成FALSE就可以了(check.names=FALSE)。

过了一会,Edwin回我,还是不行,然后我就拿了他的数据来自己实验,发现,真的不行!!!不过这个命令我前几天刚用了,我很确定可以的。

从题目中也能看出来最后找出来的原因是什么,但是这个真的花了我一天的时间做测试才发现。

结果上网查了,自己那数据试了接近一天,终于最后搞清楚了,原来因为名字中有_(下划线),如果没有下划线就是OK的。并不是,不要记住这个答案,这个答案是错误的。

我以为我获得了正确答案,就是以后在R里面,名字最好不要有下划线,直到我准备写这份记录的时候才发现,原来是可以有下划线,但是你查看数据的时候需要注意。

df<-read.table(text='A,d_,d_,A_1,A_1\n0,b,6,5,5\n2,5,6,5,6',header=T,check.names=FALSE,row.names=1,sep=',')

df

Untitled.png

可以看出,结果名字中有下划线,仍旧可以出现相同的列名。但是如果我们换一种方式查看,就不同了。

df[0:2,0:2]

Untitled.png

也就是只有在这种查看方式下,才会出现这样即便加了参数check.names=FALSE,还是有后缀的原因,这个可能只是R为了让我们查看的时候更方便而做的设定。

后记

看来做一些整理还是很有必要的,至少这个问题在做测试的时候感觉好像找到的答案,但是在整理过程中,想要重复的时候,发现和自己的预期不太一样,再试了一下,就发现原来自己理解错了。

然后如果是在jupyter notebook里面遇见这种情况,那应该是IRKernel包装导致。我猜想可能是显示的时候,IRKernel会利用df[0:11,0:11]这种形式来提取数据,才会导致这样的结果。