2016-10-15 3 views
0

Я пытаюсь проанализировать продольный вопросник, который состоит из 5 вопросов. Скажем, участники должны были ответить на этот вопросник 4 раза.Средняя шкала здания в R

Теперь я хочу создать шкалу, называемую производительность задачи. Эта шкала строится по среднему значению вопросов 1, 2 и 5.

Мне нужно это значение для каждой из 5 точек измерения. Есть ли более простой способ вычислить эти средства, чем в примере ниже?

df$performance_T1 <- with(df, rowMeans(cbind(Task1T1,Task2T1,Task5T1), na.rm = TRUE)) 
df$performance_T2 <- with(df, rowMeans(cbind(Task1T2,Task2T2,Task5T2), na.rm = TRUE)) 
df$performance_T3 <- with(df, rowMeans(cbind(Task1T3,Task2T3,Task5T3), na.rm = TRUE)) 
df$performance_T4 <- with(df, rowMeans(cbind(Task1T4,Task2T4,Task5T4), na.rm = TRUE)) 

Мой кадр данных будет выглядеть в этом примере:

df = data.frame(Task1T1 <- c(1:5), 
      Task2T1 <- c(1:5), 
      Task3T1 <- c(1:5), 
      Task4T1 <- c(1:5), 
      Task5T1 <- c(1:5), 
      Task1T2 <- c(1:5), 
      Task2T2 <- c(1:5), 
      Task3T2 <- c(1:5), 
      Task4T2 <- c(1:5), 
      Task5T2 <- c(1:5), 
      Task1T3 <- c(1:5), 
      Task2T3 <- c(1:5), 
      Task3T3 <- c(1:5), 
      Task4T3 <- c(1:5), 
      Task5T3 <- c(1:5), 
      Task1T4 <- c(1:5), 
      Task2T4 <- c(1:5), 
      Task3T4 <- c(1:5), 
      Task4T4 <- c(1:5), 
      Task5T4 <- c(1:5)) 

ответ

0

Мне кажется, что в наборе данных:

  1. Каждая строка является человек
  2. Каждый «Задача» и «Измерение» находятся в столбце.

Мы можем использовать tidyverse, наряду с принципами tidy data, реструктурировать данные.

В приведенном ниже примере я добавил ясность person_id для большей ясности.

library(tidyverse) 

df = structure(list(Task1T1 = 1:5, Task2T1 = 1:5, Task3T1 = 1:5, Task4T1 = 1:5, 
        Task5T1 = 1:5, Task1T2 = 1:5, Task2T2 = 1:5, Task3T2 = 1:5, 
        Task4T2 = 1:5, Task5T2 = 1:5, Task1T3 = 1:5, Task2T3 = 1:5, 
        Task3T3 = 1:5, Task4T3 = 1:5, Task5T3 = 1:5, Task1T4 = 1:5, 
        Task2T4 = 1:5, Task3T4 = 1:5, Task4T4 = 1:5, Task5T4 = 1:5), 
       .Names = c("Task1T1", "Task2T1", "Task3T1", "Task4T1", "Task5T1", 
          "Task1T2", "Task2T2", "Task3T2", "Task4T2", "Task5T2", 
          "Task1T3", "Task2T3", "Task3T3", "Task4T3", "Task5T3", 
          "Task1T4", "Task2T4", "Task3T4", "Task4T4", "Task5T4"), 
       row.names = c(NA, -5L), class = "data.frame") 

df %>% 
    mutate(person_id = row_number()) %>% 
    gather(task, score, -person_id) %>% 
    separate(task, into = c("Task", "Measurement"), sep = "T(?=\\d)") %>% 
    group_by(Task, person_id) %>% 
    summarise(Performance = mean(score, na.rm = T)) -> 
    perf 

head(perf) 
#> Source: local data frame [6 x 3] 
#> Groups: Task [2] 
#> 
#> Task person_id Performance 
#> <chr>  <int>  <dbl> 
#> 1 Task1   1   1 
#> 2 Task1   2   2 
#> 3 Task1   3   3 
#> 4 Task1   4   4 
#> 5 Task1   5   5 
#> 6 Task2   1   1 

Если вы хотите, чтобы данные обратно в формате одного человека в ряду, и в среднем задачи в колонках, вы можете отбросить его обратно.

perf %>% 
    spread(Task, Performance, fill = 0) 
#> # A tibble: 5 x 6 
#> person_id Task1 Task2 Task3 Task4 Task5 
#> *  <int> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1   1  1  1  1  1  1 
#> 2   2  2  2  2  2  2 
#> 3   3  3  3  3  3  3 
#> 4   4  4  4  4  4  4 
#> 5   5  5  5  5  5  5 
Смежные вопросы