我在数据框中有三个变量,并希望交换4列
"dam" "piglet" "fdate" "ssire"
至
"piglet" "ssire" "dam" "tdate"
有什么方法可以使用R进行交换吗?
任何帮助将非常感谢。
基地
dfrm <- dfrm[c("piglet", "ssire", "dam", "tdate")]
要么:
dfrm <- dfrm[ , c("piglet", "ssire", "dam", "tdate")]
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
总结其他帖子,有三种更改列顺序的方法,以及两种在每种方法中指定索引的方法。
给出一个样本数据框
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")))
你可以使用子集的'select'参数;
#Assume df contains "dam" "piglet" "fdate" "ssire"
newdf<-subset(df, select=c("piglet", "ssire", "dam", "tdate"))
我注意到这几乎是一个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)
这种方法具有以下优点:
select()
不需要将变量名称括在引号内。starts_with()
,ends_with()
等)来选择多个列,而无需为每个列命名并轻松地重新排列它们。我很快写了一个函数,它接受一个你要交换的向量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)
}