dplyr :: select - использовать столбец более одного раза? - PullRequest
0 голосов
/ 29 мая 2018
select(mtcars,foo=mpg,bar=mpg)

Это вернет фрейм данных только с одним столбцом - столбцом.Похоже, что dplyr отбрасывает предыдущие вхождения столбца, делая невозможным использование нескольких псевдонимов для одного и того же столбца.Ошибка?Дизайн?Обход

Ответы [ 5 ]

0 голосов
/ 29 мая 2018

Я не понимаю, почему все используют dplyr для обхода.База R намного быстрее :

ОБНОВЛЕНО: я написал myfun4 и myfun3 в базе R. Первый масштабируемый.Последний нет.Остальные четыре функции - это решения с dplyr.Тест показывает, что dplyr медленнее, чем в десять раз:

microbenchmark::microbenchmark(myfun1(),myfun2(),myfun3(),myfun4(),myfun5(),myfun6())
Unit: microseconds
     expr    min      lq      mean  median       uq     max neval
 myfun1() 5356.6 5739.90  6320.338 5967.45  6327.75 11177.7   100
 myfun2() 6208.1 6676.55  7220.770 6941.10  7172.55 10936.3   100
 myfun3() 8645.3 9299.30 10287.908 9676.30 10312.85 15837.1   100
 myfun4() 4426.1 4712.40  5405.235 4866.65  5245.20 12573.2   100
 myfun5()  168.6  250.05   292.472  270.70   303.15  2119.3   100
 myfun6()  141.7  203.15   341.079  237.00   256.45  6278.0   100

Код:

myfun6<-function(){
n=2
res_l<-lapply(1:n,function(j) mtcars$mpg)
res<-data.frame(do.call(cbind,res_l))
rownames(res)=rownames(mtcars)
colnames(res)=c('foo','bar')
}

myfun5<-function(){
res<-data.frame(foo=mtcars$mpg,bar=mtcars$mpg)  
}

myfun4<-function(){
  mtcars %>% 
  select(foo=mpg) %>% 
  bind_cols(bar=.$foo)
}

myfun3<-function(){
res<-map2(c('mpg', 'mpg'), c('foo', 'bar'), ~ mtcars %>% 
          select(!! .y := !! rlang::sym(.x))) %>% 
  bind_cols
}

myfun2<-function(){
  res<-transmute(mtcars, foo = mpg, bar = mpg)
}

myfun1<-function(){
  res<-mtcars %>% 
  select(foo = mpg) %>% 
  mutate(bar = foo)
}
0 голосов
/ 29 мая 2018

Вы также можете сделать

mtcars %>% 
  select(foo=mpg) %>% 
  bind_cols(bar=.$foo)

или

mtcars %>% 
  bind_cols(foo=.$mpg, bar=.$mpg)  
  select(foo, bar)
0 голосов
/ 29 мая 2018

Вы можете сделать transmute(mtcars, foo = mpg, bar = mpg) (с оговоркой, что это удаляет имена строк).

0 голосов
/ 29 мая 2018

Мы можем использовать

library(tidyverse)
library(rlang)
map2(c('mpg', 'mpg'), c('foo', 'bar'), ~ mtcars %>% 
          select(!! .y := !! rlang::sym(.x))) %>% 
  bind_cols

Или другой вариант - replicate select ed столбцов и установить имена для желаемого

replicate(2, mtcars %>%
                   select(mpg))  %>%
      set_names(c('foo', 'bar')) %>%
      bind_cols
0 голосов
/ 29 мая 2018

обходной путь: добавьте мутацию, которая использует foo для создания бара.

mtcars %>% 
  select(foo = mpg) %>% 
  mutate(bar = foo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...