Создайте переменную, фиксирующую наиболее частый случай по группе - PullRequest
6 голосов
/ 29 июня 2011

Определить:

df1 <-data.frame(
id=c(rep(1,3),rep(2,3)),
v1=as.character(c("a","b","b",rep("c",3)))
)

st

> df1
  id v1
1  1  a
2  1  b
3  1  b
4  2  c
5  2  c
6  2  c

Я хочу создать третью переменную freq, которая содержит наиболее частые наблюдения в v1 от id st

> df2
  id v1 freq
1  1  a    b
2  1  b    b
3  1  b    b
4  2  c    c
5  2  c    c
6  2  c    c

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

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

myFun <- function(x){
    tbl <- table(x$v1)
    x$freq <- rep(names(tbl)[which.max(tbl)],nrow(x))
    x
}

ddply(df1,.(id),.fun=myFun)

Обратите внимание, что which.max вернет первое вхождение максимального значения, в случаесвязей.См. ?? which.is.max в пакете nnet для опции, которая разрывает связи случайным образом.

1 голос
/ 14 ноября 2017

Другой способ состоит в использовании tidyverse функций:

  • , сначала группируя, используя group_by(), и считая вхождение второй переменной, используя tally()
  • , упорядочиваячисло вхождений с arrange()
  • суммированием и выделением первой строки с summarize() и first()

Следовательно:

df1 %>%
group_by(id, v1) %>%
tally() %>%
arrange(id, desc(n)) %>%
summarize(freq = first(v1))

Thisдаст вам только сопоставление (которое я считаю более чистым):

# A tibble: 2 x 2
     id   freq
  <dbl> <fctr>
1     1      b
2     2      c

Затем вы можете left_join ваш исходный фрейм данных с этой таблицей.

1 голос
/ 29 июня 2011
mode <- function(x) names(table(x))[ which.max(table(x)) ]
df1$freq <- ave(df1$v1, df1$id, FUN=mode)
> df1
  id v1 freq
1  1  a    b
2  1  b    b
3  1  b    b
4  2  c    c
5  2  c    c
6  2  c    c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...