【问题标题】:data frame column names no longer unique when subsetting子集时数据框列名不再唯一
【发布时间】:2017-11-29 05:33:54
【问题描述】:

我有一个包含重复列名的数据框。我知道使用重复的列名是不标准的,但这些名称实际上是使用用户输入在下游重新分配的。现在,我正在尝试在位置上对数据框进行子集化,但列名被删除了重复数据。这是一个例子。

> 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 转换行名称。 同样,如果选择了列,则列名将转换为 必要时是唯一的(例如,如果多次选择列, 或者如果选择了多个给定名称的列,如果数据 框架有重复的列名)。

这解释了原因,感谢到目前为止的 cmets 解决如何最好地解决这个问题。

【问题讨论】:

  • 是否可以在引入用户输入的步骤之前重命名它们?这可能真的很危险,这可能是让您轻松自在而不冒弄乱的风险的最佳组合。

标签: r dataframe


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2020-05-04
    相关资源
    最近更新 更多