2016-12-06 2 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

Как насчет 'дд $ D = шкале (дд $ г)'? – G5W

ответ

2

Вы можете временно nest х:

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