Использование tidyverse для динамического изменения одной переменной из одного сгруппированного набора данных из другого набора данных - PullRequest
0 голосов
/ 20 февраля 2020

Допустим, я работаю с разными классами (узлами, в моем наборе данных), и у меня тысячи студентов. У каждого учащегося есть свой собственный балл по математике, и мне нужно сравнить все индивидуальные баллы с групповым средним / сд. Чтобы справиться с этим, у меня есть два разных набора данных. Первый - это «стол». default table

Этот фрейм данных состоит из нескольких классов (узлов), их средств и их SD.

У меня также есть другой набор данных, составленный из результатов учащихся , как этот:

students' results

Я хочу иметь другой набор данных, в котором я получаю все индивидуальные результаты (то есть, 11, 6, 10 и т. д.) 1036 *) и вычтите этот результат из всех средств в первом наборе данных. В будущем потребуется проверить все результаты и все узлы вместе.

Другими словами, из первого числа (число 12 на изображении) я вычту 11 (результат учащегося) из 68 (средний результат), 6 (результат учащегося) из 68 (среднее), 10 ( результат ученика) из 68 (среднее) и др. c. Затем я перейду ко второму узлу (число 7 на изображении), и я сделаю то же самое (вычтите 11 из 74 (средний результат), 6 из 74 (средний результат), 10 из 74),

Окончательный вывод, который я хотел бы получить, ниже. Пожалуйста, примите это изображение только для иллюстрации: Final output

Из-за вопросов, чтобы прояснить мой вопрос, следующая команда также приносит интересное решение, но оно не работает, так как я Вам придется вручную добавить все столбцы в новый набор данных:

test_result %>% 
  mutate(total_header_node_12 = x - default_table$t_mean[1]) %>% 
  mutate(total_header_node_74 = x - default_table$t_mean[2]) 

Another desired output

Я искал другие вопросы, но не нашел решения. Любая помощь ценна. Я использую Tidyverse, и я хотел бы остаться в среде Tidyverse. Спасибо Воспроизвести:

> dput(default_table)
structure(list(node = structure(c(6L, 3L, 5L, 1L, 2L, 4L, 7L), .Label = c("4", 
"5", "7", "8", "10", "12", "13"), class = "factor"), t_mean = c(68.8219178082192, 
74.3260869565217, 83.0178571428571, 92.2108108108108, 98.3304347826087, 
88.6111111111111, 48.4), t_sd = c(14.4351088961341, 16.9448394654941, 
13.0272663858681, 12.2011483603603, 12.1775472144027, 14.5621088567959, 
10.4876948807826), vars = c(1, 1, 1, 1, 1, 1, 1), n = c(121, 
74, 92, 616, 191, 58, 7), mean = c(68, 74.6891891891892, 82.8369565217391, 
91.3944805194805, 97.738219895288, 88.0172413793103, 48.7142857142857
), sd = c(14.0226008048911, 16.1151045250761, 11.0426517498479, 
12.6758935948866, 12.0212336250146, 15.9169901273025, 8.63547500554709
), min = c(32, 32, 58, 36, 56, 44, 39), max = c(97, 113, 104, 
123, 128, 124, 60), range = c(65, 81, 46, 87, 72, 80, 21), se = c(1.27478189135374, 
1.87334284914993, 1.15127602962793, 0.510726307415094, 0.869825937534791, 
2.09000319547951, 3.26390275965596), q0_25 = c(59, 64, 74.75, 
84, 90, 80, 41.5), q0_5 = c(68, 73.5, 81.5, 92, 98, 87, 47), 
    q0_75 = c(80, 87.75, 92.25, 100, 106, 98.75, 56)), class = "data.frame", row.names = c(NA, 
-7L))


test_result <- data.frame(x = rnorm(100,10,2))

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Вероятно, вы можете попробовать:

library(dplyr)

default_table %>%
  tidyr::crossing(test_result) %>%
  mutate(comparative_mean = x - t_mean)

Это создает все комбинации default_table с test_result, а затем мы вычитаем два значения друг из друга.

1 голос
/ 20 февраля 2020

Вам просто нужно добавить результаты учащегося в новый столбец, а затем unnest, чтобы получить подробные данные формы, с которыми вы можете выполнить это сравнение. Возможно, есть также решение с crossing, но это кажется более простым. По сути, мы хотим вставить результаты ученика в виде нового столбца в default_table, а затем использовать unnest для расширения, чтобы в каждом узле-ученике была одна строка, как в желаемом выводе. Затем мы можем просто вычесть среднее значение из результатов учащегося.

set.seed(1)
library(tidyverse)
default_table <- structure(list(node = structure(c(6L, 3L, 5L, 1L, 2L, 4L, 7L), .Label = c("4", "5", "7", "8", "10", "12", "13"), class = "factor"), t_mean = c(68.8219178082192, 74.3260869565217, 83.0178571428571, 92.2108108108108, 98.3304347826087, 88.6111111111111, 48.4), t_sd = c(14.4351088961341, 16.9448394654941, 13.0272663858681, 12.2011483603603, 12.1775472144027, 14.5621088567959, 10.4876948807826), vars = c(1, 1, 1, 1, 1, 1, 1), n = c(121, 74, 92, 616, 191, 58, 7), mean = c(68, 74.6891891891892, 82.8369565217391, 91.3944805194805, 97.738219895288, 88.0172413793103, 48.7142857142857), sd = c(14.0226008048911, 16.1151045250761, 11.0426517498479, 12.6758935948866, 12.0212336250146, 15.9169901273025, 8.63547500554709), min = c(32, 32, 58, 36, 56, 44, 39), max = c(97, 113, 104, 123, 128, 124, 60), range = c(65, 81, 46, 87, 72, 80, 21), se = c(1.27478189135374, 1.87334284914993, 1.15127602962793, 0.510726307415094, 0.869825937534791, 2.09000319547951, 3.26390275965596), q0_25 = c(59, 64, 74.75, 84, 90, 80, 41.5), q0_5 = c(68, 73.5, 81.5, 92, 98, 87, 47), q0_75 = c(80, 87.75, 92.25, 100, 106, 98.75, 56)), class = "data.frame", row.names = c(NA, -7L))
test_result <- data.frame(x = rnorm(10,10,2))

test_result <- test_result %>%
  rowid_to_column(var = "student_number") %>%
  rename(student_result = x)

default_table %>%
  mutate(students = map(node, ~ test_result)) %>%
  unnest(students) %>%
  mutate(comparative_mean = student_result - mean) %>%
  select(node, mean, student_number, student_result, comparative_mean)
#> # A tibble: 70 x 5
#>    node   mean student_number student_result comparative_mean
#>    <fct> <dbl>          <int>          <dbl>            <dbl>
#>  1 12       68              1           8.75            -59.3
#>  2 12       68              2          10.4             -57.6
#>  3 12       68              3           8.33            -59.7
#>  4 12       68              4          13.2             -54.8
#>  5 12       68              5          10.7             -57.3
#>  6 12       68              6           8.36            -59.6
#>  7 12       68              7          11.0             -57.0
#>  8 12       68              8          11.5             -56.5
#>  9 12       68              9          11.2             -56.8
#> 10 12       68             10           9.39            -58.6
#> # … with 60 more rows

Создано в 2020-02-19 с помощью пакета prex (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...