Посчитайте, сколько раз каждое значение появляется в строке данных r - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующий фрейм данных (79000 строк):

ID       P1      P2      P3      P4        P5        P6      P7     P8  
1       38005   28002   38005   38005    28002    34002      NA     NA
2       28002   28002   28002   38005    28002    NA         NA     NA

Я хочу подсчитать, сколько раз каждое число (код) появляется в строке фрейма данных.Итак, результат примерно такой:

38005 appears 3   28002 appears 2    34002 appears 1     NA appears 2 
28002 appears 3   38005 appears 1    28002 appears 1     NA appears 3 

До сих пор я пытался найти наиболее частое число (код):

df$frequency <-apply(df,1,function(x) names(which.max(table(x))))

Но я не знаю, как посчитать числораз каждый номер (код) появляется в строке.

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

data.table решение

#read sample data
dt <- fread( "ID       P1      P2      P3      P4        P5        P6      P7     P8  
1       38005   28002   38005   38005    28002    34002      NA     NA
             2       28002   28002   28002   38005    28002    NA         NA     NA")
#melt
dt.melt <- melt(dt, id = 1, measure = patterns("^P"), na.rm = FALSE)
#and cast
dcast( dt.melt, ID ~ value, fun = length, fill = 0 )

#    ID 28002 34002 38005 NA
# 1:  1     2     1     3  2
# 2:  2     4     0     1  3
0 голосов
/ 11 декабря 2018

Используя tidyverse и reshape2, вы можете сделать:

df %>%
 gather(var, val, -ID) %>% #Transforming the data from wide to long format
 group_by(val, ID) %>% #Grouping 
 summarise(count = n()) %>% #Performing the count
 dcast(ID~val, value.var = "count") #Reshaping the data

  ID 28002 34002 38005 NA
1  1     2     1     3  2
2  2     4    NA     1  3

Отображение первых двух столбцов без NA с наибольшим количеством в соответствии с ID:

df %>%
 gather(var, val, -ID) %>% #Transforming the data from wide to long format
 group_by(val, ID) %>% #Grouping
 mutate(temp = n()) %>% #Performing the count
 group_by(ID) %>% #Grouping
 mutate(temp2 = dense_rank(temp)) %>% #Creating the rank based on count
 group_by(ID, val) %>% #Grouping
 summarise(temp3 = first(temp2), #Summarising 
           temp = first(temp)) %>%
 arrange(ID, desc(temp3)) %>% #Arranging
 na.omit() %>% #Deleting the rows with NA
 group_by(ID) %>%
 mutate(temp4 = ifelse(temp3 == first(temp3) | temp3 == nth(temp3, 2), 1, 0)) %>% #Identifying the highest and the second highest count
 filter(temp4 == 1) %>% #Selecting the highest and the second highest count
 dcast(ID~val, value.var = "temp") #Reshaping the data

  ID 28002 38005
1  1     2     3
2  2     4     1
0 голосов
/ 11 декабря 2018

Я думаю, что вы ищете это.

sort(table(unlist(df1[-1])), decreasing=TRUE)
# 31002 38005 24003 34002 28002 
# 13222 13193 13019 13018 12625 

Это означает, что вы исключаете столбец 1, содержащий идентификаторы, и «выводите из списка» оставшуюся часть вашего фрейма данных в вектор.Затем table() подсчитывает появление каждого значения, которое вы также можете sort().Установите опцию decreasing=TRUE, и первые два значения являются двумя наиболее частыми.

Если вывод становится длинным из-за большого количества значений, вы можете включить код в head(.).Длина вывода по умолчанию равна шести, но вы можете ограничить ее до двух, указав n=2, что даст вам именно то, что вы хотите.Никаких пакетов не нужно.

head(sort(table(unlist(df1[-1])), decreasing=TRUE), n=2)
# 31002 38005 
# 13222 13193

ДАННЫЕ:

set.seed(42)  # for sake of reproducibility
df1 <- data.frame(id=1:9750,
                  matrix(sample(c(38005, 28002, 34002, NA, 24003, 31002), 7.8e4, 
                                replace=TRUE), nrow=9750,
                         dimnames=list(NULL, paste0("P", 1:8))))
0 голосов
/ 11 декабря 2018
ID <- c("P1","P2","P3","P4","P5","P6","P7","P8","P1","P2","P3","P4","P5","P6","P7","P8","P1")
count <-c("38005","28002","38005","38005","28002","34002","NA","NA","2","28002","28002","28002","38005","28002","NA","NA","NA")

df<- cbind.data.frame(ID,count)

table(df$count)

Используйте этот код, чтобы узнать количество

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