首页 > 解决方案 > 将数据集与“数据框”合并,列名从 ; 到。,为什么?

问题描述

我在我的数据集中发现了一些东西,但我不明白它为什么会发生。在这里,我复制了数据集。当我将两个数据框合并为一个时;正在更改为点“。”,但仅在我执行 df <- data.frame(dfmeta,dd) 时发生,而不是在执行 df <- cbind(dfmeta,dd) 时发生。当我做 data.frame 时发生了什么(以及为什么)?非常感谢您的建议!

 a <- c("Bacteria;p","Bacteria;p","Bacteria;p")
b <- c("Bacteroidetes;c",   "Firmicutes;c", "Bacteroidetes;c")
c <- c("Bacteroidia;o", "Clostridia;o", "Bacteroidia;o")
otu <- data.frame(a,b,c)


name <- apply(otu,1,function(x) paste(x, collapse = ' '))
a <- data.frame(name)
q1<- c(2,3,4)
q2<- c(5,6,7)
q3<- c(2,6,9)
dd<- data.frame(q1,q2,q3)
colnames(dd)<- name
dd
  Bacteria;p Bacteroidetes;c Bacteroidia;o Bacteria;p Firmicutes;c Clostridia;o
1                                        2                                    5
2                                        3                                    6
3                                        4                                    7
  Bacteria;p Bacteroidetes;c Bacteroidia;o
1                                        2
2                                        6
3                                        9
b.t <- c(1:3)
bb <- LETTERS[1:3]
dfmeta <- data.frame(b.t,bb)
df <- data.frame(dfmeta,dd)
df
b.t bb Bacteria.p.Bacteroidetes.c.Bacteroidia.o Bacteria.p.Firmicutes.c.Clostridia.o
1   1  A                                        2                                    5
2   2  B                                        3                                    6
3   3  C                                        4                                    7
  Bacteria.p.Bacteroidetes.c.Bacteroidia.o.1
1                                          2
2                                          6
3                                          9

标签: r

解决方案


如果您检查?data.frame函数,它有默认check.names设置为的参数。TRUE

check.names
逻辑。如果为 TRUE,则检查数据框中的变量名称以确保它们是语法上有效的变量名称并且不重复。如有必要,它们会被调整(通过 make.names),这样它们就可以了。

这意味着它会尝试为您传递的数据创建语法上有效的列名。

什么是语法上有效的名称在?make.names

语法上有效的名称由字母、数字和点或下划线字符组成,并以字母或点开头,后跟数字。“.2way”等名称无效,保留字也无效。如有必要,可在前面加上字符“X”。所有无效字符都被翻译成“.”

因此,所有带有空格或分号的列名都替换为点。cbind没有这样的参数,因此它允许在语法上无效的列名。

如果你想data.frame允许它也关闭check.names

data.frame(dfmeta,dd, check.names = FALSE)

#  b.t bb Bacteria;p Bacteroidetes;c Bacteroidia;o Bacteria;p Firmicutes;c Clostridia;o
#1   1  A                                        2                                    5
#2   2  B                                        3                                    6
#3   3  C                                        4                                    7
#  Bacteria;p Bacteroidetes;c Bacteroidia;o
#1                                        2
#2                                        6
#3                                        9

推荐阅读