Необходимо найти самые высокие 5 столбцов и связанные с ними значения для каждой строки в кадре данных в R - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть список сотрудников, каждый из которых содержит 10 переменных целочисленных данных различных атрибутов о каждом сотруднике, и мне нужно знать пять самых высоких переменных, относящихся к каждому человеку (строке) в этом кадре данных.В дополнение к 5 старшим именам переменных, мне также нужно знать 5 старших значений переменных для каждой строки (каждого сотрудника).

Простой пример ниже (имена столбцов = целочисленные переменные, связанные с сотрудником, имена строк =идентификаторы сотрудников).

set.seed(1)
DF <- matrix(sample(1:9,9),ncol=10,nrow=9)
DF <- as.data.frame.matrix(DF)
>DF

#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  3  2  5  6  5  2  6  8  1   3
# 2  1  4  7  8  7  7  3  4  2   9
# 3  2  3  4  7  5  8  9  1  3   5
# 4  3  8  3  4  5  6  7  4  6   5
# 5  6  2  3  7  2  1  8  3  2   4
# 6  8  2  4  8  3  2  9  7  6   5
# 7  1  5  3  6  8  3  8  9  1   3
# 8  9  3  5  8  4  9  7  8  1   2
# 9  1  2  4  8  3  2  1  2  5   6

Заранее спасибо!

Ответы [ 2 ]

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

Если вы хотите сохранить форму, вы можете просто сделать все, кроме верхних 5 для каждой строки NA

out <- t(apply(DF, 1, function(x) ifelse(x %in% tail(sort(x), 5), x, NA)))
colnames(out) <- colnames(DF)
rownames(out) <- rownames(DF)
out

#    V1 V2 V3 V4 V5 V6 V7 V8 V9
# 1  NA  9  5  6 NA NA  8  7 NA
# 2  NA NA  8  5  7 NA  6 NA  9
# 3  NA  7  8 NA  9 NA  5 NA  6
# 4  NA  7 NA  8  6 NA NA  9  5
# 5   8 NA  6 NA  5  7 NA NA  9
# 6   8 NA NA  5  7 NA NA  9  6
# 7  NA  9 NA NA  6 NA  7  8  5
# 8  NA  6 NA  9 NA NA  8  5  7
# 9  NA NA  9  6  5 NA  8  7 NA
# 10  7 NA NA  5 NA  9 NA  8  6

Вы также можете печатать, не показывая все NA s

print(out, na.print = '')

#    V1 V2 V3 V4 V5 V6 V7 V8 V9
# 1      9  5  6        8  7   
# 2         8  5  7     6     9
# 3      7  8     9     5     6
# 4      7     8  6        9  5
# 5   8     6     5  7        9
# 6   8        5  7        9  6
# 7      9        6     7  8  5
# 8      6     9        8  5  7
# 9         9  6  5     8  7   
# 10  7        5     9     8  6

Другой вариант:

out <- t(apply(DF, 1, function(x){
  o <- head(order(-x), 5)
  paste0(names(x[o]), ':', x[o])
}))
as.data.frame(out)

#      V1   V2   V3   V4   V5
# 1  V2:9 V7:8 V8:7 V4:6 V3:5
# 2  V9:9 V3:8 V5:7 V7:6 V4:5
# 3  V5:9 V3:8 V2:7 V9:6 V7:5
# 4  V8:9 V4:8 V2:7 V5:6 V9:5
# 5  V9:9 V1:8 V6:7 V3:6 V5:5
# 6  V8:9 V1:8 V5:7 V9:6 V4:5
# 7  V2:9 V8:8 V7:7 V5:6 V9:5
# 8  V4:9 V7:8 V9:7 V2:6 V8:5
# 9  V3:9 V7:8 V8:7 V4:6 V5:5
# 10 V6:9 V8:8 V1:7 V9:6 V4:5

Использованные данные (из ответа emsinko)

set.seed(1)
DF <- t(replicate(10,sample(1:9,9)))              # random values
DF <- as.data.frame.matrix(DF)
0 голосов
/ 04 декабря 2018

Быстрое решение (вывод в списке):

set.seed(1)
DF <- t(replicate(10,sample(1:9,9)))              # random values
DF <- as.data.frame.matrix(DF)

output <- list()   # init empty list
for(i in 1:10) output[[i]] <- sort(DF[i,], decreasing = TRUE)[1:5]  
print(output)

> output
[[1]]
  V2 V7 V8 V4 V3
1  9  8  7  6  5

[[2]]
  V9 V3 V5 V7 V4
2  9  8  7  6  5

.... and so on

Я могу попробовать сделать это в другом формате вывода, просто укажите, как должен выглядеть вывод

...