2016-03-03 17 views
13

Cố gắng sử dụng dplyr-group_by biến stud_ID trong khung dữ liệu sau đây, như trong this SO question:Cố gắng sử dụng dplyr để group_by và áp dụng quy mô()

> str(df) 
'data.frame': 4136 obs. of 4 variables: 
$ stud_ID   : chr "ABB112292" "ABB112292" "ABB112292" "ABB112292" ... 
$ behavioral_scale: num 3.5 4 3.5 3 3.5 2 NA NA 1 2 ... 
$ cognitive_scale : num 3.5 3 3 3 3.5 2 NA NA 1 1 ... 
$ affective_scale : num 2.5 3.5 3 3 2.5 2 NA NA 1 1.5 ... 

Tôi đã thử các sau đây để có được điểm theo thang đo của sinh viên (chứ không phải là điểm quy mô cho các quan sát trên tất cả các sinh viên):

scaled_data <- 
      df %>% 
       group_by(stud_ID) %>% 
        mutate(behavioral_scale_ind = scale(behavioral_scale), 
         cognitive_scale_ind = scale(cognitive_scale), 
         affective_scale_ind = scale(affective_scale)) 

Dưới đây là kết quả:

> str(scaled_data) 
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 4136 obs. of 7 variables: 
$ stud_ID    : chr "ABB112292" "ABB112292" "ABB112292" "ABB112292" ... 
$ behavioral_scale : num 3.5 4 3.5 3 3.5 2 NA NA 1 2 ... 
$ cognitive_scale  : num 3.5 3 3 3 3.5 2 NA NA 1 1 ... 
$ affective_scale  : num 2.5 3.5 3 3 2.5 2 NA NA 1 1.5 ... 
$ behavioral_scale_ind: num [1:12, 1] 0.64 1.174 0.64 0.107 0.64 ... 
    ..- attr(*, "scaled:center")= num 2.9 
    ..- attr(*, "scaled:scale")= num 0.937 
$ cognitive_scale_ind : num [1:12, 1] 1.17 0.64 0.64 0.64 1.17 ... 
    ..- attr(*, "scaled:center")= num 2.4 
    ..- attr(*, "scaled:scale")= num 0.937 
$ affective_scale_ind : num [1:12, 1] 0 1.28 0.64 0.64 0 ... 
    ..- attr(*, "scaled:center")= num 2.5 
    ..- attr(*, "scaled:scale")= num 0.782 

Ba biến số được chia tỷ lệ (behavioral_scale, cognitive_scaleaffective_scale) chỉ có 12 quan sát - cùng một số quan sát cho học sinh đầu tiên, ABB112292.

Điều gì đang xảy ra ở đây? Làm thế nào tôi có thể có được điểm số theo từng cá nhân?

+0

Các bạn đã nhìn vào 'tóm tắt() 'trong' dplyr'? – count

+3

Tôi nghĩ bạn nên thay đổi trước khi bạn nhóm, hoặc bạn sẽ tập trung điểm số của mỗi học sinh vào chính mình – C8H10N4O2

+0

@ C8H10N4O2, do đó, mỗi quan sát của học sinh sẽ có M = 0 và SD = 1 –

Trả lời

22

Sự cố dường như nằm trong hàm cơ sở scale(), kỳ vọng một ma trận. Hãy thử viết của riêng bạn.

scale_this <- function(x){ 
    (x - mean(x, na.rm=TRUE))/sd(x, na.rm=TRUE) 
} 

Sau đó, công trình này:

library("dplyr") 

# reproducible sample data 
set.seed(123) 
n = 1000 
df <- data.frame(stud_ID = sample(LETTERS, size=n, replace=TRUE), 
       behavioral_scale = runif(n, 0, 10), 
       cognitive_scale = runif(n, 1, 20), 
       affective_scale = runif(n, 0, 1)) 
scaled_data <- 
    df %>% 
    group_by(stud_ID) %>% 
    mutate(behavioral_scale_ind = scale_this(behavioral_scale), 
     cognitive_scale_ind = scale_this(cognitive_scale), 
     affective_scale_ind = scale_this(affective_scale)) 

Hoặc, nếu bạn đang mở cửa cho một giải pháp data.table:

library("data.table") 

setDT(df) 

cols_to_scale <- c("behavioral_scale","cognitive_scale","affective_scale") 

df[, lapply(.SD, scale_this), .SDcols = cols_to_scale, keyby = factor(stud_ID)] 
7

Đây là một known problem trong dplyr, một sửa chữa đã được sáp nhập vào phiên bản phát triển mà bạn có thể cài đặt qua

# install.packages("devtools") 
devtools::install_github("hadley/dplyr") 

Trong phiên bản ổn định, sau đây nên làm việc, quá:

scale_this <- function(x) as.vector(scale(x)) 
Các vấn đề liên quan