2016-12-06 33 views
1

所以我不確定如何說出這個問題,但它很基本。我當然想找到一種優雅的方式,將其包含在一個dplyr轉換管中。組內的刻度變量常量

比方說,我有一個數據幀

set.seed(1) 
dd <- data.frame(id = rep(c(1,2), c(3,5)), 
       x = rnorm(8), 
       d = rep(c(0.3, 0.5), c(3,5))) 

我想通過縮放版本替換d,即而不是0.3和0.5,我想有

> as.numeric(scale(c(0.3, 0.5))) 
[1] -0.7071068 0.7071068 

的當我在管道中使用scale時,唯一的問題是較大組(id = 2)受到更多重量,並且獲得的值爲

> dd %>% 
+ mutate(scale_d = scale(d)) 
    id   x d scale_d 
1 1 -0.6264538 0.3 -1.2076147 
2 1 0.1836433 0.3 -1.2076147 
3 1 -0.8356286 0.3 -1.2076147 
4 2 1.5952808 0.5 0.7245688 
5 2 0.3295078 0.5 0.7245688 
6 2 -0.8204684 0.5 0.7245688 
7 2 0.4874291 0.5 0.7245688 
8 2 0.7383247 0.5 0.7245688 

我覺得這應該是一個很簡單的問題,所以也許有一個簡單的解決方案呢?

+0

如何'DD $ d =規模(DD $ d)'? – G5W

回答

2

可以暫時nest X:

library(tidyverse) 

dd %>% 
    nest(x) %>% 
    mutate(scale_d = scale(d)) %>% 
    unnest() 

## # A tibble: 8 × 4 
##  id  d scale_d   x 
## <dbl> <dbl>  <dbl>  <dbl> 
## 1  1 0.3 -0.7071068 -0.6264538 
## 2  1 0.3 -0.7071068 0.1836433 
## 3  1 0.3 -0.7071068 -0.8356286 
## 4  2 0.5 0.7071068 1.5952808 
## 5  2 0.5 0.7071068 0.3295078 
## 6  2 0.5 0.7071068 -0.8204684 
## 7  2 0.5 0.7071068 0.4874291 
## 8  2 0.5 0.7071068 0.7383247