Можно ли поменять местами столбцы в кадре данных с помощью R? - PullRequest
18 голосов
/ 20 апреля 2011

У меня есть три переменные в фрейме данных, и я хотел бы поменять 4 столбца с

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

на

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

Есть ли способ сделать обмен с помощьюR?

Любая помощь будет очень признателен.

Баз

Ответы [ 6 ]

31 голосов
/ 20 апреля 2011
dfrm <- dfrm[c("piglet", "ssire", "dam", "tdate")]

ИЛИ:

dfrm <- dfrm[ , c("piglet", "ssire", "dam", "tdate")]
13 голосов
/ 20 апреля 2011
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 голосов
/ 20 апреля 2011

Подводя итог остальным публикациям, существует три способа изменения порядка столбцов и два способа задания индексации в каждом методе.

С учетом образца фрейма данных

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

Ответ Кохске: Вы можете использовать стандартную матричную индексацию, используя номера столбцов

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

или используя имена столбцов

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

DWin & Gavin's answer: Фреймы данных позволяют опустить аргумент строкипри указании индекса.

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

PaulHurleyuk's answer: Вы также можете использовать subset.

subset(dfr, select = c(2, 4, 1, 3))
subset(dfr, select = c(c("piglet", "ssire", "dam", "fdate")))
6 голосов
/ 20 апреля 2011

Вы можете использовать аргумент 'select' для подмножества;

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

newdf<-subset(df, select=c("piglet", "ssire", "dam", "tdate"))
2 голосов
/ 16 марта 2019

Я заметил, что это почти 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. Вам придется печатать меньше, поскольку select() не требует, чтобы имена переменных были заключены в кавычки.
  2. В случае, если ваши данныеВ кадре более 4 переменных, вы можете использовать вспомогательные функции выбора, такие как starts_with(), ends_with() и т. д., чтобы выбрать несколько столбцов, не называя каждый столбец и не упрощая их перестановку.
0 голосов
/ 30 сентября 2018

Я быстро написал функцию, которая берет вектор 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)
}
...