Создать поле метаданных в R - PullRequest
0 голосов
/ 22 октября 2018

У меня настроен фрейм данных, подобный следующему:

id <- c(123,234,123,234)
task <- c(54,23,12,58)
a <- c(23,67,45,89)
b <- c(78,45,65,45)

df <- data.frame(id,task,a,b)
> df
   id task  a  b
1 123   54 23 78
2 234   23 67 45
3 123   12 45 65
4 234   58 89 45

, где я получаю баллы a и b для каждого идентификатора:

df$score <- rowMeans(subset(df, select = c(3:4)), na.rm = TRUE)
> df
   id task  a  b score
1 123   54 23 78  50.5
2 234   23 67 45  56.0
3 123   12 45 65  55.0
4 234   58 89 45  67.0

для каждого идентификатора. Я получил совокупный баллвот так:

out <- ddply(df, 1, summarise,
                    overall = mean(score, na.rm = TRUE))
> out
   id overall
1 123   52.75
2 234   61.50

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

   id overall                                meta
1 123   52.75 "task_scores":[{"54":50.5,"12":55}]
2 234   61.50   "task_scores":[{"23":56,"58":67}]

как бы я поступил так с помощью R?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы можете сделать это с несколькими мутациями.Вставьте свои результаты, получите среднее значение по строке, а затем по группе.

library(dplyr)
df %>%
  mutate(score = rowMeans(subset(., select = c(3:4)), na.rm = TRUE)) %>% 
  group_by(id) %>% 
  mutate(overall = mean(score)) %>% 
  mutate(tally = paste(task, score, sep = ":", collapse = ","))

  # A tibble: 4 x 7
# Groups:   id [2]
     id  task     a     b score overall tally        
  <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl> <chr>        
1   123    54    23    78  50.5    52.8 54:50.5,12:55
2   234    23    67    45  56      61.5 23:56,58:67  
3   123    12    45    65  55      52.8 54:50.5,12:55
4   234    58    89    45  67      61.5 23:56,58:67 

И чтобы получить желаемый конечный результат, просто выберите и нарежьте.

    df %>%
  mutate(score = rowMeans(subset(., select = c(3:4)), na.rm = TRUE)) %>% 
  group_by(id) %>% 
  mutate(overall = mean(score)) %>% 
  mutate(tally = paste(task, score, sep = ":", collapse = ",")) %>% 
  select(id, overall, tally) %>% 
  slice(1)

  # A tibble: 1 x 3
     id overall tally        
  <dbl>   <dbl> <chr>        
1   123    52.8 54:50.5,12:55
2   234    61.5 23:56,58:67
0 голосов
/ 23 октября 2018

Мы могли бы использовать jsonlite для создания структуры

library(jsonlite)
library(plyr)
ddply(df, "id", summarise, overall = mean(score, na.rm = TRUE),
    meta = paste0('"task_scores":', 
              toJSON(setNames(as.data.frame.list(score), task))))
#   id overall                                meta
#1 123   52.75 "task_scores":[{"54":50.5,"12":55}]
#2 234   61.50   "task_scores":[{"23":56,"58":67}]
0 голосов
/ 22 октября 2018

Я не знаю, как сделать этот словарь метаданных случайным, но вы могли бы сделать что-то вроде этого:

library(dplyr)
library(magrittr)
out <- df %>% group_by(id) %>%  mutate(overall = mean(score))

> out
# A tibble: 4 x 6
# Groups:   id [2]
     id  task     a     b score overall
  <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl>
1   123    54    23    78  50.5    52.8
2   234    23    67    45  56      61.5
3   123    12    45    65  55      52.8
4   234    58    89    45  67      61.5

Так что df будет иметь как агрегированные оценки, так и сохранять данные в исходных строках.

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