2017-02-10 20 views
2

У меня есть числовые переменные в DataFrame. Я хочу создать новые переменные, которые являются среднесрочными версиями оригиналов, добавить новые переменные в мою фреймворк данных и переименовать новые переменные, чтобы они имели те же имена, что и оригиналы, но с суффиксом «_m».Как использовать lapply для создания новых переменных в DataFrame и переименовать их

На данный момент я могу сделать это только в два этапа, и я подмножество с использованием индексов столбцов, что не очень гибко.

Есть ли способ объединить мой двухступенчатый подход в одном, а также избежать использования индексов столбцов, чтобы процесс работал без необходимости подсчета количества столбцов, которые я хочу иметь в центре внимания, а затем выяснения количества новых столбцов это означало бы добавление к моему файлу данных? Я не должен использовать lapply, если есть лучший способ.

Вот упрощенная версия моего нынешнего подхода:

df <- data.frame(a = letters[1:10], b = 1:10, c = 11:20) 

df[4:5] <- lapply(df[2:3], function(x) { 
     y <- scale(x, center = T, scale = F) 
    } 
) 

names(df)[4:5] <- lapply(names(df)[2:3], function(x) { 
    y <- paste0(x, "_m") 
    } 
) 
+0

'library (dplyr); fun1 <- function (x) {scale (x, center = TRUE, scale = FALSE)}; mutate_if (df, is.numeric, funs ('_ m' = fun1)) ' – Sotos

+1

@Sotos Это здорово, спасибо, я не знал о' mutate_if' или что вы можете менять имена столбцов, используя 'funs'. – meenaparam

+0

Существует также 'mutate_at', который может пригодиться для вашего дела – Sotos

ответ

3

В базовой R, вы могли бы сделать

cbind(df, setNames(lapply(df[2:3], scale, scale=F), 
        paste0(names(df)[2:3], "_m"))) 

который возвращает

a b c b_m c_m 
1 a 1 11 -4.5 -4.5 
2 b 2 12 -3.5 -3.5 
3 c 3 13 -2.5 -2.5 
4 d 4 14 -1.5 -1.5 
5 e 5 15 -0.5 -0.5 
6 f 6 16 0.5 0.5 
7 g 7 17 1.5 1.5 
8 h 8 18 2.5 2.5 
9 i 9 19 3.5 3.5 
10 j 10 20 4.5 4.5 

Имена новых столбцов применяются с setNames.

+0

@Imo Спасибо, я не знал о функции 'setNames'. Я всегда использовал «имена», но это решает мою проблему. – meenaparam

 Смежные вопросы

  • Нет связанных вопросов^_^