是否可以使用R在数据框中交换列?

问题描述 投票:18回答:6

我在数据框中有三个变量,并希望交换4列

"dam"   "piglet"   "fdate"   "ssire"

"piglet"   "ssire"   "dam"   "tdate"

有什么方法可以使用R进行交换吗?

任何帮助将非常感谢。

基地

r swap
6个回答
31
投票
dfrm <- dfrm[c("piglet", "ssire", "dam", "tdate")]

要么:

dfrm <- dfrm[ , c("piglet", "ssire", "dam", "tdate")]

13
投票
d <- data.frame(a=1:3, b=11:13, c=21:23)
d
#  a  b  c
#1 1 11 21
#2 2 12 22
#3 3 13 23
d2 <- d[,c("b", "c", "a")]
d2
#   b  c a
#1 11 21 1
#2 12 22 2
#3 13 23 3

或者你可以使用索引做同样的事情:

d3 <- d[,c(2, 3, 1)]
d3
#   b  c a
#1 11 21 1
#2 12 22 2
#3 13 23 3

8
投票

总结其他帖子,有三种更改列顺序的方法,以及两种在每种方法中指定索引的方法。

给出一个样本数据框

dfr <- data.frame(
  dam    = 1:5,
  piglet = runif(5),
  fdate  = letters[1:5],
  ssire  = rnorm(5)
)

Kohske的回答:您可以使用列号来使用标准矩阵式索引

dfr[, c(2, 4, 1, 3)]

或使用列名称

dfr[, c("piglet", "ssire", "dam", "fdate")]

DWin&Gavin的回答:数据框允许您在指定索引时省略行参数。

dfr[c(2, 4, 1, 3)]
dfr[c("piglet", "ssire", "dam", "fdate")]

PaulHurleyuk的回答:你也可以使用subset

subset(dfr, select = c(2, 4, 1, 3))
subset(dfr, select = c(c("piglet", "ssire", "dam", "fdate")))

6
投票

你可以使用子集的'select'参数;

#Assume df contains "dam" "piglet" "fdate" "ssire"

newdf<-subset(df, select=c("piglet", "ssire", "dam", "tdate"))

2
投票

我注意到这几乎是一个8岁的问题。但是对于那些开始学习R而且可能偶然发现这个问题的人,就像我一样,你现在可以使用select()包中一个非常灵活的dplyr函数来完成交换操作,如下所示。

# Install and load the dplyr package
install.packages("dplyr")
library("dplyr")

# Override the existing data frame with the desired column order
df <- select(df, piglet, ssire, dam, tdate)

这种方法具有以下优点:

  1. 您必须键入less,因为select()不需要将变量名称括在引号内。
  2. 如果您的数据框有超过4个变量,您可以使用选择辅助函数(如starts_with()ends_with()等)来选择多个列,而无需为每个列命名并轻松地重新排列它们。

0
投票

我很快写了一个函数,它接受一个你要交换的向量v和列索引a和b。

swappy = function(v,a,b){  # where v is a dataframe, a and b are the columns indexes to swap

name = deparse(substitute(v))

helpy = v[,a]
v[,a] = v[,b]
v[,b] = helpy


name1 = colnames(v)[a] 
name2 = colnames(v)[b] 

colnames(v)[a] = name2
colnames(v)[b] = name1

assign(name,value = v , envir =.GlobalEnv)
}
© www.soinside.com 2019 - 2024. All rights reserved.