【问题标题】:Partial reordering of data frame columns do not move the column's names [duplicate]数据框列的部分重新排序不会移动列的名称[重复]
【发布时间】:2016-08-10 16:07:23
【问题描述】:

当我尝试使用"[" 对列进行部分重新排序时,值会被交换,但列的名称不会移动。请参见下面的示例:

x = data.frame(x1 = c(1,2,3), x2 = c(2,3,4), x3 = c("e","e","e"), x4 = c("f","f","f"))

x
#x1 x2 x3 x4
#1  2  e  f
#2  3  e  f
#3  4  e  f

x[, c(3,4)] = x[, c(4,3)]
#x1 x2 x3 x4
#1  2  f  e
#2  3  f  e
#3  4  f  e

关于为什么列的名称没有移动以及如何简单地解决这个问题的任何想法?

【问题讨论】:

  • 切换名称可能更合理。 names(x)[c(3,4)] <- names(x)[c(4,3)]
  • @DavidArenburg 我不认为这是链接的欺骗
  • @DavidArenburg 这根本不是重复的。与列交换相关的所有问题都不相同。
  • @YohanObadia 如果您想知道“为什么” - 很简单。您将 x[, c(4,3)] 分配到 x[, c(3,4)] 。这就是它的工作原理。 [] 保留了 x 的原始结构。这与您对x[] <- lapply(x, type.convert) 的操作相同。尽管lapply 返回一个列表而不是data.frame,但x 仍然是data.frame。除此之外,该骗局中的所有答案都与您的问题相关

标签: r dataframe


【解决方案1】:

试试这个

x <- x[,c(1,2,4,3)]

【讨论】:

  • 这行得通,但这并不是我真正想要的。我很好奇为什么它不像我那样工作。 @akrun answer 更彻底地解决了这个问题。
【解决方案2】:

一个选项是cbind

x1 <- cbind(x[1:2], x[4:3])
x1
#  x1 x2 x4 x3
#1  1  2  f  e
#2  2  3  f  e
#3  3  4  f  e

或者我们也可以使用数字排序


通过赋值,我们只改变值而不改变列名。列值确实会随位置而变化,但它不会通过交换列名来转换,因为列名对于该位置是固定的。

【讨论】:

  • 这很聪明,谢谢。但是,在我将其标记为已回答之前,您能否详细说明为什么我所写的内容仅在 x[, c(4,3)] 明确包含列名称时才更改值。
  • @YohanObadia 该分配仅通过交换更改列的值。如果我们需要更改名称,则必须单独完成,因为列名是该列的一种标识。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多