Создание нескольких новых столбцов с учетом значений предыдущих столбцов с измененными именами в R - PullRequest
1 голос
/ 21 февраля 2020

У меня есть кадр данных, который выглядит следующим образом, но с большим количеством столбцов и строк.

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

У кого-нибудь есть предложения, как мне сделать это более эффективно?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вы можете сделать то же самое непосредственно для фрейма данных:

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_at с dplyr

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

data

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))
1 голос
/ 21 февраля 2020

Мы можем использовать mutate с across в версии devel dplyr

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

Или с data.table

library(data.table)
setDT(df1)[, paste0(nm1, 2) := .SD^2, .SDcols = nm1]

данные

df1 <- 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...