2017-01-20 3 views
2

У меня есть dataframe, подобный этомуScale все значения в зависимости от группы

ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3) 
p1 <- c(21000, 23400, 26800, 2345, 23464, 34563, 456433, 56543, 34543,3524, 353, 3432, 4542, 6343, 4534) 
p2 <- c(234235, 2342342, 32, 23432, 23423, 2342342, 34, 2343, 23434, 23434, 34, 234, 2343, 34, 5) 
my.df <- data.frame(ID, p1, p2) 

Теперь я хотел бы, чтобы масштабировать значения в p1 и p2 в зависимости от их ID. Таким образом, весь столбец будет масштабироваться, как при использовании функции tapply(), но масштабирование выполняется один раз для всех значений для идентификатора 1, затем для всех значений ID 2 и т. Д. То же самое для масштабирования p2. Новый блок данных должен состоять из масштабированных значений.

Я уже пытался

df_scaled <- ddply(my.df, my.df$ID, scale(my.df$p1)) 

, но получаю сообщение об ошибке

.fun is not a function. 

Спасибо за вашу помощь!

ответ

1

dplyr делает это легко:

ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3) 
p1 <- c(21000, 23400, 26800, 2345, 23464, 34563, 456433, 56543, 34543,3524, 353, 3432, 4542, 6343, 4534) 
p2 <- c(234235, 2342342, 32, 23432, 23423, 2342342, 34, 2343, 23434, 23434, 34, 234, 2343, 34, 5) 
my.df <- data.frame(ID, p1, p2) 

library(dplyr) 
df_scaled <- my.df %>% group_by(ID) %>% mutate(p1 = scale(p1), p2=scale(p2)) 

Обратите внимание, что есть ошибка в стабильной версии dplyr при работе со шкалой; вам может потребоваться обновить версию dev (см. комментарии).

+0

или более общий 'my.df%>% group_by (ID)%>% mutate_at (vars (matches ('p')), funs (scale))' – Sotos

+0

Спасибо. Он работает на фрейме данных, который я привел здесь в качестве примера, но с реальным фреймворком данных я получаю сообщение об ошибке: неожиданный «=» в «scaled_data <- predictortable_panel%>% group_by (predortable_panel $ ID)%>% mutate (predortable_panel $ p1 = «--- любая идея, почему она не примет знак равенства? – GNee

+0

Не следует повторять имя фрейма данных внутри функций' dplyr' (т. е. удалить 'predictortable_panel $'); 'mutate (p1 = .. .' и т. д. – mpjdem

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