2015-04-21 54 views
0

我正在學習使用dplyr pkg。使用R dplyr拋出錯誤

library(dplyr) 

的玩具數據集:

d <- expand.grid("id"=1:3,"x1"=10:12,"x2"=(20:22)) 

後來我可以通過列需要循環,我的真實數據有30K行,70列

i <- 2 

在這裏,我希望可以用通用變量名稱

my.variable <- names(d[i]) 
my.variable 

函數到每個組歸一化爲範圍0-1

norm <- function(x) (x - min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x,na.rm = TRUE)) 

df.out <- d %>% group_by(id) %>% mutate(x.norm = norm(get(my.variable, envir = as.environment(d)))) 

引發錯誤:

Error: incompatible size (%d), expecting %d (the group size) or 1 

理解爲對錯誤的原因任何幫助。此外,這是做這種正常化任務的可行方式嗎?

回答

2

不知道,如果你真的想要的列在@詹姆斯的回答。在這裏,我明白你的問題:

d %>% group_by(id) %>% mutate_each(funs(norm(.))) 

Groups: id 

    id x1 x2 
1 1 0.0 0.0 
2 2 0.0 0.0 
3 3 0.0 0.0 

...

+0

謝謝Dieter!一個極好的和經濟的解決方案!我已經給您的解決方案進行了一些33K行和73列的壓力測試:在老化的筆記本電腦上處理不到2秒鐘。超出了我所有的期望。 –

+0

讚美是哈德利。以前的'ddplyr'是一個很好的概念,但速度很慢。所以'dplyr'中的重啓是值得的。 –

2

的問題來自於使用get,我敢肯定是違反了@hadley許可協議;)

評價字符的參數,你可以使用mutate_each_q。然而,使用單一的功能時,它會覆蓋變量,因此必須使用兩個函數和下降之後第二個變量:

d %>% group_by(id) %>% mutate_each_q(funs(x.norm=norm, identity),my.variable) %>% 
     select(-identity) 
Source: local data frame [6 x 4] 
Groups: id 

    id x1 x2 x.norm 
1 1 10 20 0.0 
2 2 10 20 0.0 
3 3 10 20 0.0 
4 1 11 20 0.5 
5 2 11 20 0.5 
6 3 11 20 0.5 
... 
+1

+1哈德利許可協議。然而'mutate_each_q'被描述,'head'隱含在'tbl_df'中,即'dplyr'的結果(稍微簡化)。 –

+0

哈德利韋翰的榮譽!詹姆斯,感謝您的意見和一些對我而言是新鮮的想法。 –