我有一个雇员列表,每个雇员具有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
谢谢!
答案 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)