根据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
变量中的列。Dodf[paste0(cols,2)]