как сделать, чтобы новые переменные проходили через две переменные в фрейме данных - PullRequest
4 голосов
/ 05 июня 2019

Я новичок в R и хочу знать, как я могу создать новые переменные, зациклив две переменные в фрейме данных.

Я пытаюсь изменить фрейм данных с помощью двух переменных. Я сделал код, используяФункция mutate, и она отлично работает с несколькими столбцами.

df
n     sd2_t    sd1_t     sd2neg_t     sd1neg_t
1     20       22        10           11
2     25       26        20           22
3     30       33        15           12

df2<-df%>%
dplyr::mutate(sd2_s=sd2_t*n,
              sd1_s=sd1_t*n,
              sd2neg_s=sd2neg_t*n,
              sd1neg_s=sd1neg_t*n)

Expected output
n sd2_t sd1_t sd2neg_t sd1neg_t sd2_s sd1_s sd2neg_s sd1neg_s
1    20    22       10       11    20    22       10       11
2    25    26       20       22    50    52       40       44
3    30    33       15       12    90    99       45       36

Но у меня есть еще столбцы для изменения, и я хочу сделать код более простым. Я попытался найти «циклы» и функцию lapply, но не смог решить проблему самостоятельно и мне нужна помощь.

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Используя dplyr, мы можем использовать mutate_at, чтобы выбрать столбцы, заканчивающиеся на "t", и умножить каждый из них на n.

library(dplyr)
df %>%
  mutate_at(vars(ends_with("t")), list(s = ~. * n))

#  n sd2_t sd1_t sd2neg_t sd1neg_t sd2_t_s sd1_t_s sd2neg_t_s sd1neg_t_s
#1 1    20    22       10       11      20      22         10         11
#2 2    25    26       20       22      50      52         40         44
#3 3    30    33       15       12      90      99         45         36

Не то, чтобы это было необходимо, поскольку у вас уже есть векторизованное решение от @thelatemail, но поскольку вы пытались использовать lapply, один из способов сделать это был бы

df[sub("_t$", "_s", names(df[-1]))] <- lapply(df[-1], `*`, df$n)
2 голосов
/ 05 июня 2019

Поскольку это просто векторизованная операция над каждой строкой, нет необходимости явно зацикливаться.
Просто умножьте весь кусок вашего набора данных, а затем присвойте новым столбцам небольшое переименование:

dat[sub("_t$", "_s", names(dat[-1]))] <- dat[-1] * dat$n
dat
#  n sd2_t sd1_t sd2neg_t sd1neg_t sd2_s sd1_s sd2neg_s sd1neg_s
#1 1    20    22       10       11    20    22       10       11
#2 2    25    26       20       22    50    52       40       44
#3 3    30    33       15       12    90    99       45       36

Где dat было:

dat <- read.table(text="n     sd2_t    sd1_t     sd2neg_t     sd1neg_t
1     20       22        10           11
2     25       26        20           22
3     30       33        15           12", header=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...