как использовать семейную команду `map` в пакете ** purrr **, чтобы поменять местами столбцы между строками во фрейме данных? - PullRequest
1 голос
/ 07 августа 2020

Представьте, что на столе лежат 4 карточки, и их несколько рядов (например, 5 рядов в демонстрации). Стоимость каждой карты уже указана во фрейме демонстрационных данных. Однако точное положение карты индексируется столбцами pos , см. Демонстрационные данные, которые я создал ниже.

Для этого я меняю карты с помощью функции [] в строки, чтобы вернуть значения карточек в исходное положение. Следующий код уже выполняет такую ​​задачу. Чтобы избежать явного использования l oop, мне интересно, смогу ли я добиться аналогичного эффекта, если использую функцию векторизации с пакетами из семейства tidyverse , например pmap или связанной с ним функцией внутри пакет мурлыкать ?

# 1. data generation ------------------------------------------------------
rm(list=ls())
vect<-matrix(round(runif(20),2),nrow=5)
colnames(vect)<-paste0('card',1:4)

order<-rbind(c(2,3,4,1),c(3,4,1,2),c(1,2,3,4),c(4,3,2,1),c(3,4,2,1))
colnames(order)=paste0('pos',1:4)
dat<-data.frame(vect,order,stringsAsFactors = F)

# 2. data swap ------------------------------------------------------------
for (i in 1:dim(dat)[1]){
  orders=dat[i,paste0('pos',1:4)]
  card=dat[i,paste0('card',1:4)]
  vec<-card[order(unlist(orders))]
  names(vec)=paste0('deck',1:4)
  dat[i,paste0('deck',1:4)]<-vec
}
dat



1 Ответ

3 голосов
/ 07 августа 2020

Вы можете использовать pmap_dfr:

card_cols <- grep('card', names(dat))
pos_cols <- grep('pos', names(dat))

dat[paste0('deck', seq_along(card_cols))] <- purrr::pmap_dfr(dat, ~{
    x <- c(...)
    as.data.frame(t(unname(x[card_cols][order(x[pos_cols])])))
})
dat

#  card1 card2 card3 card4 pos1 pos2 pos3 pos4 deck1 deck2 deck3 deck4
#1  0.05  0.07  0.16  0.86    2    3    4    1  0.86  0.05  0.07  0.16
#2  0.20  0.98  0.79  0.72    3    4    1    2  0.79  0.72  0.20  0.98
#3  0.50  0.79  0.72  0.10    1    2    3    4  0.50  0.79  0.72  0.10
#4  0.03  0.98  0.48  0.06    4    3    2    1  0.06  0.48  0.98  0.03
#5  0.41  0.72  0.91  0.84    3    4    2    1  0.84  0.91  0.41  0.72

Здесь следует отметить одну вещь - убедиться, что выходные данные функции pmap не имеют исходных имен столбцов. Если у них есть исходные имена, столбцы будут перетасованы в соответствии с именами, и вывод будет в неправильном порядке. Я использую здесь unname, чтобы удалить имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...