Подсчет частоты - PullRequest
       3

Подсчет частоты

0 голосов
/ 10 апреля 2019

Итак, у меня есть файл Excel с форматом:

StudID      Score

2234          96
1056          20
9886          70
6542          65
4315          15
2234          40
6542          97
9886          56
4315          32
6542          54

, и я пытаюсь получить частоту каждого вхождения StudID.Где бы я получил :

StudID        Frequency

2234              2
1056              1
9886              2
4315              2
6542              3

Кроме того, исходя из вышеизложенного, я хотел бы получить StudID с наибольшей частотой , следовательно, в этом случае это будет StudID 6542 .

stud <- read.csv("student.csv")
freq <- table(stud$StudID)
colnames(freq) <- c("StudID", "Frequency")
freq[which.max(freq)]

но мне показалось, что я получаю сообщение об ошибке:

Ошибка в colnames<- (*tmp*,value = c ("StudID", "Frequency")): попытка установить 'colnames' для объекта с менее чем двумя измерениями

Ответы [ 2 ]

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

Ошибка говорит вам, что вы пытаетесь присвоить colnames объекту с менее чем двумя измерениями.Действительно, если мы проверим структуру table(), то увидим, что это одномерный объект, то есть

str(table(df$V1))
 'table' int [1:5**(1d)**] 1 2 2 2 2 #(1d = 1 dimension)
 - attr(*, "dimnames")=List of 1
  ..$ : chr [1:5] "1056" "2234" "4315" "6542" ...

Что вы хотите сделать - это сначала преобразовать в фрейм данных, а затем присвоить именат. е.

dd <- setNames(as.data.frame(table(df$V1)), c('StudID', 'Freq'))

#  StudID Freq
#1   1056    1
#2   2234    2
#3   4315    2
#4   6542    3
#5   9886    2

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

dd$StudID[which.max(dd$Freq)]
#[1] 6542
#Levels: 1056 2234 4315 6542 9886

ДАННЫЕ:

dput(df)
structure(list(V1 = c(2234L, 1056L, 9886L, 4315L, 2234L, 6542L, 
9886L, 4315L, 6542L, 6542L), V2 = c(96L, 20L, 70L, 15L, 40L, 
97L, 56L, 32L, 54L, 13L)), class = "data.frame", row.names = c(NA, 
-10L))

РЕДАКТИРОВАТЬ: Чтобы он не возвращал уровни в соответствии с вашим комментарием, мы можем просто преобразовать в символ, то есть

dd$StudID <- as.character(dd$StudID)
dd$StudID[which.max(dd$Freq)]
#[1] 6542
2 голосов
/ 10 апреля 2019

В базе R мы могли бы использовать aggregate и затем следовать вашей which.max логике

freq <- aggregate(Score~StudID, df, length)
freq[which.max(freq$Score), ]

#  StudID Score
#4   6542     3

Или если вы хотите только ID

freq$StudID[which.max(freq$Score)]
#[1] 6542

Или с table

names(which.max(table(df$StudID)))
#[1] "6542"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...