dplyr :: select - 多次使用列?

时间:2018-05-29 14:27:26

标签: r dplyr

select(mtcars,foo=mpg,bar=mpg)

这将返回一个只有一列的数据框 - 条。看起来dplyr会丢弃以前出现的列,从而无法为同一列创建多个别名。错误?设计?解决办法:

5 个答案:

答案 0 :(得分:1)

解决方法:添加一个使用foo创建条形的mutate。

mtcars %>% 
  select(foo = mpg) %>% 
  mutate(bar = foo)

答案 1 :(得分:1)

您可以执行transmute(mtcars, foo = mpg, bar = mpg)(但需要注意这会删除行名称。)

答案 2 :(得分:0)

我们可以使用

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

答案 3 :(得分:0)

你也可以

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

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

答案 4 :(得分:0)

我不明白为什么每个人都在使用dplyr来解决这个问题。基数R 快得多

更新:我在基地R中写了myfun4myfun3。前者是可扩展的。后者不是。其他四个功能是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)
}