根据R中具有修改名称的先前列的值创建多个新列

根据R中具有修改名称的先前列的值创建多个新列,r,function,dplyr,tidyverse,R,Function,Dplyr,Tidyverse,我有一个数据框,看起来像下面这样,但是有更多的列和行 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 ca

我有一个数据框,看起来像下面这样,但是有更多的列和行

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

df$dog_c2您也可以直接对数据帧执行相同的操作:

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

如果只希望对选定列执行此操作,可以执行以下操作:

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
数据

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))

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

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

如果只希望对选定列执行此操作,可以执行以下操作:

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
数据

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))

df我们可以在
dplyr的devel版本中使用
mutate
cross

df %>% mutate_at(cols, list(`2` = ~.^2))
library(dplyr)
df1 %>% 
    mutate(across(everything(), list(~ .x^2), names = "{col}2"))
#  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
或用于选定列

nm1 <- c('dog_c','cat_c')
df1 %>% 
    mutate(across(all_of(nm1), list(~ .x^2), names = "{col}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
数据
df1我们可以在
dplyr的devel版本中使用
mutate
cross

df %>% mutate_at(cols, list(`2` = ~.^2))
library(dplyr)
df1 %>% 
    mutate(across(everything(), list(~ .x^2), names = "{col}2"))
#  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
或用于选定列

nm1 <- c('dog_c','cat_c')
df1 %>% 
    mutate(across(all_of(nm1), list(~ .x^2), names = "{col}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
数据
df1如果我只想对原始数据帧中的列子集执行此操作,该怎么办?@melbez选择
cols
变量中的列。执行
df[paste0(cols,2)]如果我只想对原始数据帧中的一部分列执行此操作,该怎么办?@melbez选择
cols
变量中的列。Do
df[paste0(cols,2)]