我有如下数据集:
a <- structure(list(ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9"),
E = c(1, 0, 0, 0,4, 4, 3, 0,1),
W = c(0, 3, 2, 0, 3, 3, 3, 4,1),
N = c(1, 0, 2, 0, 3, 4, 3, 7,1),
S=c(0, 0, 0, 2, 1, 1, 3, 0,1)),
.Names = c("ID", "E", "W", "N", "S"), row.names = c(NA, -9L), class = "data.frame")
a
ID E W N S
1 a1 1 0 1 0
2 a2 0 3 0 0
3 a3 0 2 2 0
4 a4 0 0 0 2
5 a5 4 3 3 1
6 a6 4 3 4 1
7 a7 3 3 3 3
8 a8 0 4 7 0
9 a9 1 1 1 1
我想创建一个 class
列,它将根据每行的最大数量显示 column name
。例如,ID 为 a2
的第二行的 W
列的最大值 为 3。类将为 W
,最大值将为 3。当最大值 出现平局时,它将包括所有平局的列名称。例如,对于第 1 行 (ID=a1
),E
列和 N
列都具有相同的最大值,因此该类将定义为 E-N
,最大值将为 1。
我已经开始使用 melt
函数:
library(reshape2)
a1= melt(a, id=c("ID"))
head(a1)
ID variable value
1 a1 E 1
2 a2 E 0
3 a3 E 0
4 a4 E 0
5 a5 E 4
6 a6 E 4
最终输出将是:
ID Class Max
1 a1 E-N 1
2 a2 W 3
3 a3 W-N 2
4 a4 S 2
5 a5 E 4
6 a6 E-N 4
7 a7 E-W-N-S 3
8 a8 N 7
9 a9 E-W-N-S 1
最佳答案
使用 apply
的 Base R 方法是在每一行中找到 max
并找到相应的列名。
a[c("max", "class")] <- t(apply(a[-1], 1, function(x) {
val <- max(x)
c(val, paste(names(a)[-1][x == val], collapse = "-"))
}))
a[c(1, 6, 7)]
# ID max class
#1 a1 1 E-N
#2 a2 3 W
#3 a3 2 W-N
#4 a4 2 S
#5 a5 4 E
#6 a6 4 E-N
#7 a7 3 E-W-N-S
#8 a8 7 N
#9 a9 1 E-W-N-S
您还可以使用 which
获取列名(如@tmfmnk 所建议),将 apply
中的最后一行替换为
c(val, paste(names(which(x == val)), collapse = "-"))
关于r - 基于列值的类分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306415/