переменная вызова, которая была сгруппирована по - PullRequest
1 голос
/ 26 сентября 2019

Некоторые примеры данных:

 df <- data.frame(lang = rep(c("A", "B", "C"), 3), 
                  answer = rep(c("1", "2", "3"), each=3))

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

 df2 <- df %>%
   Total = count(lang) %>%  # count is short hand for tally + group_by()
   filter(answer=='2') %>% 
   mutate(prop = NROW(answer)/NROW(Total)) 

 Error in group_vars(x) : object 'lang' not found

Я хотел бы добавить новый столбецмой фрейм данных, в котором указано соотношение ответа «2» к общему количеству наблюдений на каждом уровне lang.Так сколько раз «2» встречается в «А» пропорционально общему количеству наблюдений в «А»?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Вот решение, которое делает то, что вы хотите:

df %>% 
  group_by(lang) %>% 
  summarize(
    prop = length(lang[answer==2])/n()
  )

Здесь мы группируем переменную или переменные, которые вы хотите установить в качестве уникальных групп, для которых вы хотите получить пропорцию, и затем используете summarize рассчитать длину вектора одной из переменных, где ответ равен 2, и разделить ее на количество строк в группировке.Если по какой-либо причине вам нужен столбец поддержки И столбец ответов, просто измените summarize на mutate.

Причина, по которой вы получили ошибку об отсутствии lang, заключается в том, что countнеобходимо использовать в качестве функции, такой как mutate, то есть

df %>% 
  count(lang, name = "Total")

Вы можете добиться того же, адаптируя свой код, но вы должны использовать add_count (чтобы ваш столбец ответов был сохранен) или mutate(Total = n()).Однако group_by был разработан для решения подобных проблем, и определенно стоит потратить некоторое время на изучение.

df %>% 
  add_count(lang, name = "Total") %>% 
  filter(answer == 2) %>% 
  add_count(lang, name = "Twos") %>% 
  distinct(lang, .keep_all = TRUE) %>% 
  mutate(prop = Twos/Total) %>% 
  select(lang, prop)
0 голосов
/ 27 сентября 2019

Вероятно, лучше использовать data.table, чем фреймы данных.Код понятнее.Не должно быть необходимости цеплять подобные функции при простом подмножестве.

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

Чтобы получить запрошенное значение, 0.3333

df <- data.table(df)
df[,nrow(.SD[answer == 2])/nrow(.SD),by="lang"]

   lang        V1
1:    A 0.3333333
2:    B 0.3333333
3:    C 0.3333333

(специальная переменная .SD представляет собой подмножество данных by)

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