首页 > 解决方案 > 在 R 中以具有修改名称的先前列的值为条件创建多个新列

问题描述

我有一个如下所示的数据框,但包含更多列和行。

dog_c  cat_c  cheese_c  hat_c 
3      4      3         2
3      1      2         5
5      2      1         4 

我想创建一个如下所示的数据框。我想从原始数据框中对给定列中的所有值进行平方,然后创建一个与原始数据框相同但末尾为 2 的列名。然后我想将它附加到原始数据框。

dog_c  cat_c  cheese_c  hat_c  dog_c2  cat_c2  cheese_c2  hat_c2 
3      4      3         2      9       16      9          4
3      1      2         5      9       1       2          5
5      2      1         4      25      4       1          16

我知道我可以通过以下方式为每个新列执行此操作。

df$dog_c2 <- (df$dog_c)^2

有人对我如何更有效地做到这一点有建议吗?

标签: rfunctiondplyrtidyverse

解决方案


您也可以直接对数据框执行相同操作:

df[paste0(names(df), 2)] <- df^2
df

#  dog_c cat_c cheese_c hat_c dog_c2 cat_c2 cheese_c2 hat_c2
#1     3     4        3     2      9     16         9      4
#2     3     1        2     5      9      1         4     25
#3     5     2        1     4     25      4         1     16

如果你想这样做dplyr,你可以使用mutate_all

library(dplyr)
df %>% mutate_all(list(`2` = ~. ^2))

如果我们只想对选定的列执行此操作,我们可以这样做:

cols <- c('dog_c','cat_c') #Use regex if there are lot of columns.
df[paste0(cols, 2)] <- df[cols]^2

#  dog_c cat_c cheese_c hat_c dog_c2 cat_c2
#1     3     4        3     2      9     16
#2     3     1        2     5      9      1
#3     5     2        1     4     25      4

mutate_atdplyr

df %>% mutate_at(cols, list(`2` = ~.^2))

数据

df <- structure(list(dog_c = c(3L, 3L, 5L), cat_c = c(4L, 1L, 2L), 
cheese_c = 3:1, hat_c = c(2L, 5L, 4L)), class = "data.frame", 
row.names = c(NA, -3L))

推荐阅读