Усреднение определенных значений строки для создания нового столбца в R - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь объединить конкретные вопросы, чтобы сформировать новые объединенные вопросы со значениями, которые являются средними из вопросов, которые были объединены. Я хочу только среднее значение для конкретного идентификатора. В приведенном ниже примере я пытаюсь объединить вопросы 1 и 2 (abc и def), а затем создать столбец, который включает в себя среднее из двух значений для каждого участника (обозначено идентификатором).

Это пример того, как выглядит оригинальный фрейм данных:

id  question  qnumber  value
1   abc       1        1
1   def       2        3
1   ghi       3        4
2   abc       1        2
2   def       2        4
2   ghi       3        1

Это то, что я хотел бы, чтобы датафрейм выглядел.

id  question  qnumber  value
1   abcdef    1        2
1   ghi       3        4
2   abcdef    1        3
2   ghi       3        1

В моем фактическом наборе данных у меня 17 вопросов, и я хотел бы объединить 3 пары, что дает 14 вопросов (11 независимых и 3 из объединенных вопросов). Мне все равно, если в итоговом столбце «вопрос» имена вопросов будут объединены в том же стиле, что и выше, но я подумал, что это облегчит понимание. Столбец qnumber не очень важен, но я не был уверен, будет ли проще комбинировать определенные строки на основе числа (как в «qnumber»), а не на основе строки (как в « вопрос "), поэтому я включил его.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Я бы позаботился об этом case_when() от dplyr.

library(tidyverse)


df <- tribble(~id,  ~question,  ~qnumber,  ~value,
              1,   "abc",       1,        1,
              1,   "def",       2,        3,
              1,   "ghi",       3,        4,
              2,   "abc",       1,        2,
              2,   "def",       2,        4,
              2,   "ghi",       3,        1)

df %>%
    mutate(question = case_when(question %in% c("abc",
                                                "def") ~ "abcdef",
                                TRUE ~ question)) %>%
    group_by(id, question) %>%
    summarise(value = mean(value)) %>%
    ungroup
#> # A tibble: 4 x 3
#>      id question value
#>   <dbl> <chr>    <dbl>
#> 1    1. abcdef      2.
#> 2    1. ghi         4.
#> 3    2. abcdef      3.
#> 4    2. ghi         1.

Создано в 2018-04-26 пакетом Представ (v0.2.0).

0 голосов
/ 26 апреля 2018

Вот один из способов решения этой проблемы, используя tidyverse и вектор поиска для обработки вопроса.

dat <- read.table(text = "id  question  qnumber  value
1   abc       1        1
                  1   def       2        3
                  1   ghi       3        4
                  2   abc       1        2
                  2   def       2        4
                  2   ghi       3        1", header = T, stringsAsFactors = FALSE)

library(tidyverse)


# set up named vector for combining (flexible in the real world with more pairs)
lu <- rep("abcdef", 2) %>% set_names(c("abc", "def"))


dat %>% mutate(new_question = ifelse(question %in% names(lu), # add in new column for combination
                                     lu[question],
                                     question)) %>%
    group_by(new_question, id) %>% # group via relevant columns: id and new_question
    summarise(avg_val = mean(value)) # calculate your averages

# A tibble: 4 x 3
# Groups:   new_question [?]
  new_question    id avg_val
         <chr> <int>   <dbl>
1       abcdef     1       2
2       abcdef     2       3
3          ghi     1       4
4          ghi     2       1

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

...