子集化时,数据框列名称不再唯一

时间:2017-11-28 19:28:52

标签: r dataframe

我有一个包含重复列名的数据框。我知道使用重复的列名称是非标准的,但这些名称实际上是使用用户输入重新分配到下游的。目前,我尝试按位置对数据框进行子集,但列名称会进行重复数据删除。这是一个例子。

> df <- data.frame(x = 1:4, y = 2:5, y = LETTERS[2:5], y = (2+(2:5)), check.names = F)
> df
  x y y y
1 1 2 B 4
2 2 3 C 5
3 3 4 D 6
4 4 5 E 7

但是,当我尝试子集时,名称会改变......

> df[, 1:3]
  x y y.1
1 1 2   B
2 2 3   C
3 3 4   D
4 4 5   E

有没有办法防止这种情况发生?它只发生在我对列而不是行进行子集时。

> df[1:3,]
  x y y y
1 1 2 B 4
2 2 3 C 5
3 3 4 D 6

编辑其他人注意到此行为:

我已经从extract.data.frame(类型?'[')的帮助页面中了解了行为和相关部分

相关部分说明:

  

如果[返回一个数据框,它将具有唯一(和非缺失)行   名称,如有必要,使用make.unique转换行名称。   同样,如果选择了列,则列名将转换为   必要时是唯一的(例如,如果多次选择列,   或者,如果数据选择了给定名称的多个列   框架具有重复的列名称。)

这解释了原因,感谢迄今为止关于如何最好地解决这个问题的评论。

1 个答案:

答案 0 :(得分:3)

这是一个选项,虽然我认为重复的列名不是一个好主意。

as.data.frame(as.list(df)[1:3], check.names = F)

#   x y y
# 1 1 2 B
# 2 2 3 C
# 3 3 4 D
# 4 4 5 E