需要在R

时间:2018-12-03 20:15:10

标签: r dataframe matrix max

我有一个雇员列表,每个雇员具有10个有关每个雇员的各种属性的整数数据变量,并且我需要知道此数据框中与每个人(行)相关的最高五个变量。除了5个最高变量名称之外,我还需要知道每行(每个员工)的5个最高变量值。

下面是一个简单的示例(列名=与员工相关的整数变量,行名=员工ID)。

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 :(得分:1)

快速解决方案(列表中的输出):

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

我可以尝试以其他输出格式进行操作,只需指定输出的外观即可

答案 1 :(得分:1)

如果要保持形状,可以只制作每行的{5},除前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的情况下打印

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)