Пропорционально заполнить новую переменную на основе значений в предыдущем столбце? - PullRequest
0 голосов
/ 25 апреля 2019

Я хотел бы создать новую переменную, используя информацию в другом месте моего фрейма данных. Это кажется простым, но я бы хотел назначить уровни новой переменной пропорционально.

У меня есть датафрейм:

dd<-read.table(text="
group     piece      answer
group1     A          noise
group1     A          silence
group1     A          silence
group1     B          silence
group1     B          loud_noise
group1     B          noise
group1     B          loud_noise
group1     B          noise
group2     C          silence
group2     C          silence", header=TRUE)

Я хотел бы создать новую переменную "major_annotation" с двумя уровнями: хорошим и плохим. Хороший означает, что у каждой части было согласие большинства (> 55%). Плохо означает, что у части не было согласия большинства.

    group     piece      answer       majority_agreement
    group1     A          noise       good 
    group1     A          silence     good
    group1     A          silence     good
    group1     B          silence     bad
    group1     B          loud_noise  bad
    group1     B          noise       bad
    group1     B          loud_noise  bad
    group1     B          noise       bad
    group2     C          silence     good
    group2     C          silence     good

Я могу сделать это в двоичном (все или без соглашения):

    newdf <- df %>% 
      group_by(group) %>% 
      mutate(majority_agreement = ifelse(length(unique(answer)) <= 1,        
    'good', 
          ifelse(length(unique(answer) > 1) & 
          (length(unique(answer)) >= 2), 'bad', 'bad'))) %>% 
      as.data.frame

Как я могу сделать это пропорционально, хотя?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Это похоже на то, что вы хотите, используя dplyr

library(dplyr)
dd %>% 
  group_by(piece) %>% 
  mutate(majority_agreement = if_else(max(table(answer)/n())>.55, "good", "bad"))

Внутри каждого «куска» мы используем table(), чтобы подсчитать количество различных ответов и разделить их на n(), чтобы получитьпропорция для каждого из этих ответов.Мы смотрим, если максимальная доля больше, чем .55.Если это так, мы даем метку «хорошо», в противном случае мы даем метку «плохо»

1 голос
/ 25 апреля 2019
library(dplyr)
newdf <- df %>% 
  count(group, piece, answer) %>%   # How many of each answer for each group & piece
  group_by(group, piece) %>%
  mutate(share = n / sum(n)) %>%  # What share have this answer?
  summarize(max_share = max(share)) %>%  # What's the largest share among them?
  mutate(majority_agreement = if_else(max_share > 0.55, "good", "bad")) %>%
  ungroup() %>%
  right_join(df)  # Add the conclusion back to the original data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...