R 重命名具有相同名称的数据框的列

R 重命名具有相同名称的数据框的列,r,R,我正在用存储在字符数组中的名称重命名R中数据帧(data)的列 如果字符数组中的两个名称相同(名称),例如(“JK”、“JK”、“test”、“hi”) 使用 colnames(Data) <- Names colnames(Data) 期望输出: "JK" "JK" "test" "hi" 我不明白为什么第二个名字后面加了.1 有没有关于如何避免这种情况的建议?更改列名的原因是基于make.unique调用data.frame,该调用会更改重复的列名 make.unique(c("J

我正在用存储在字符数组中的名称重命名R中数据帧(data)的列

如果字符数组中的两个名称相同(名称),例如(“JK”、“JK”、“test”、“hi”)

使用

colnames(Data) <- Names
colnames(Data)
期望输出:

"JK" "JK" "test" "hi"
我不明白为什么第二个名字后面加了.1


有没有关于如何避免这种情况的建议?

更改列名的原因是基于
make.unique
调用
data.frame
,该调用会更改重复的列名

make.unique(c("JK", "JK", "JK", "test"))
#[1] "JK"   "JK.1" "JK.2" "test"

我们可以使用
sub
来匹配
是一个元字符,它意味着任何字符-因此转义
\\
以获得字面意义)然后是一个或多个数字(
\\d+
)到字符串的结尾(
$
),并将其替换为空白(
“”


注意:最好在数据中使用唯一的列名,而不是重复的列名

更改列名的原因基于更改重复列名的
make.unique
调用
data.frame

make.unique(c("JK", "JK", "JK", "test"))
#[1] "JK"   "JK.1" "JK.2" "test"

我们可以使用
sub
来匹配
是一个元字符,它意味着任何字符-因此转义
\\
以获得字面意义)然后是一个或多个数字(
\\d+
)到字符串的结尾(
$
),并将其替换为空白(
“”

注意:数据中最好有唯一的列名,而不是重复的列名

我不明白为什么第二个名字后面加了.1

这是因为数据帧的colname必须是唯一的。如果两列的名称相同,您将如何选择一列? 为了避免将.1追加到colname,请确保您的names数组具有所有唯一的元素。您可以在names数组中编写一个函数检查是否存在重复项,并替换为逻辑项

我不明白为什么第二个名字后面加了.1

这是因为数据帧的colname必须是唯一的。如果两列的名称相同,您将如何选择一列?
为了避免将.1追加到colname,请确保您的names数组具有所有唯一的元素。您可以在names数组中编写一个函数检查是否存在重复项,并替换为逻辑项

在R中,
data.frame
不应具有重复的列名。对于
data.frame(…,check.names=FALSE)
,我们强烈地感觉到这是默认行为。在您的示例中,不清楚
Data$JK
Data[[“JK”]]
是否应该返回。但是,您可以始终允许使用
data.frame(a=1,a=2,check.names=FALSE)
@r2evans data$JK保留我的案例。请说明a=1和a=2的含义是什么?数据$JK的哪个版本?我的示例是演示使用两个同名列创建data.frame的一种方法。将该帧分配给(例如)
dat
,然后(1)查看您得到的
dat$a
的哪个值,然后(2)如何到达名为
dat$a
的第二列?当然,有一种直接的方法,但也有一些函数在框架上工作,它们并不总是以与您输入的列完全相同的顺序返回列。这意味着您可能无法确定引用的是两个同名列中的哪一列。一句话:坏主意。坦白说,你的代码对我来说毫无意义。如果我用
dat@r2evans制作了一个假的data.frame,那么事情就清楚了。正如您正确地指出的,同名列的索引不是先验的,我的真实案例中的列数约为5000。字符数组中存在的名称是通过解析文件获得的。我恐怕无法将其添加到此处。在R中,
data.frame
不应具有重复的列名。对于
data.frame(…,check.names=FALSE)
,我们强烈地感觉到这是默认行为。在您的示例中,不清楚
Data$JK
Data[[“JK”]]
是否应该返回。但是,您可以始终允许使用
data.frame(a=1,a=2,check.names=FALSE)
@r2evans data$JK保留我的案例。请说明a=1和a=2的含义是什么?数据$JK的哪个版本?我的示例是演示使用两个同名列创建data.frame的一种方法。将该帧分配给(例如)
dat
,然后(1)查看您得到的
dat$a
的哪个值,然后(2)如何到达名为
dat$a
的第二列?当然,有一种直接的方法,但也有一些函数在框架上工作,它们并不总是以与您输入的列完全相同的顺序返回列。这意味着您可能无法确定引用的是两个同名列中的哪一列。一句话:坏主意。坦白说,你的代码对我来说毫无意义。如果我用
dat@r2evans制作了一个假的data.frame,那么事情就清楚了。正如您正确地指出的,同名列的索引不是先验的,我的真实案例中的列数约为5000。字符数组中存在的名称是通过解析文件获得的。我恐怕无法将其添加到此处。
names(Data) <- sub("\\.\\d+$", "", names(Data))
names(Data)
#[1] "JK"   "JK"   "test" "hi"  
library(stringr)
names(Data) <- str_remove(names(Data), "\\.\\d+#$")