2017-01-20 54 views
2

所有值我有類似這樣的規模取決於

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的值,並根據他們的ID P2 。因此,不會像使用tapply()函數那樣對整列進行縮放,而是對ID 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穩定版中的錯誤;您可能需要更新到開發版本(請參閱評論)。

+0

或更多通用'my.df%>%group_by(ID)%>%mutate_at(vars(matches('p')),funs(scale))' – Sotos

+0

謝謝。它適用於我以這裏作爲示例提供的數據框,但使用真實的數據框,我得到了錯誤:「scaled_data < - predictortable_panel%>%group_by(predictortable_panel $ ID)%> mutate(predictortable_panel $ p1 = 「---任何想法爲什麼它不會等號? – GNee

+0

你不應該在'dplyr'函數內重複數據幀的名稱(即移除'predictortable_panel $');'mutate(p1 = .. .'等應該可以工作。 – mpjdem