select(mtcars,foo=mpg,bar=mpg)
这将返回一个只有一列的数据框 - 条。看起来dplyr会丢弃以前出现的列,从而无法为同一列创建多个别名。错误?设计?解决办法:
答案 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中写了myfun4
和myfun3
。前者是可扩展的。后者不是。其他四个功能是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)
}