R:在数据帧中根据旧的向量生成许多新向量

时间:2018-06-19 08:00:53

标签: r

我有一个这样的数据框:

test<-data.frame(year=c(1,2,3),cyl_ring=c(4,3,2),gear_ring=c(1,1,1),wheel_ring=c(1,2,2))#correct typo:change `,` to `=`

我希望制作一个新的数据集&#34; test2 &#34;包含测试以及测试中名称以&#34结尾的每一列; ring&#34;我希望制作新的列,我用另一个后缀将其名称更改为同名,例如&#34; rang&#34;,然后乘以0.5

新数据:

 test<-data.frame(year=c(1,2,3),cyl_ring=c(4,3,2),gear_ring=c(1,1,1),wheel_ring=c(1,2,2),cyl_rang=c(2,1.5,1),gear_rang=c(0.5,0.5,0.5),wheel_rang=c(0.5,1,1))

2 个答案:

答案 0 :(得分:1)

dplyr方式执行此操作:

library(dplyr)
library(stringr)
test<-data.frame(year=c(1,2,3),cyl_ring=c(4,3,2),gear_ring=c(1,1,1),wheel_ring=c(1,2,2))


test %>%
    mutate_at(vars(ends_with("ring")),funs("new" = . * 0.5)) %>% #dplyr can also add suffix to variable name while using this syntax    
    rename_at(vars(ends_with("ring_new")),~str_replace(.x,"ring_new","rang"))

唯一的问题是,我不知道dplyr如何能够同时变异和重命名(不只是添加后缀,而是更改变量名称)多个变量。所以我需要两行来完成它。

结果1

> test %>%
    +     mutate_at(vars(ends_with("ring")),funs("new" = . * 0.5))
year cyl_ring gear_ring wheel_ring cyl_ring_new gear_ring_new wheel_ring_new
1    1        4         1          1          2.0           0.5            0.5
2    2        3         1          2          1.5           0.5            1.0
3    3        2         1          2          1.0           0.5            1.0

结果2

> test %>%
    +     mutate_at(vars(ends_with("ring")),funs("new" = . * 0.5)) %>%
    +     rename_at(vars(ends_with("ring_new")),~str_replace(.x,"ring_new","rang"))
year cyl_ring gear_ring wheel_ring cyl_rang gear_rang wheel_rang
1    1        4         1          1      2.0       0.5        0.5
2    2        3         1          2      1.5       0.5        1.0
3    3        2         1          2      1.0       0.5        1.0

答案 1 :(得分:0)

到目前为止我自己的解决方案:

tmp=test[grep("^.*ring",colnames(test),perl=TRUE)]*0.5
colnames(tmp) <- gsub("(^.*)ring","\\1rang",colnames(tmp))
test2<-cbind(test,tmp)