在数据框中返回包含所有变量中最大值的列。

4
zone_id=1:6
v1=c(12,22,31,12,5,17)
v2=c(15,22,28,16,18,21)
v3=c(18,10,14,9,10,17)
v4=c(20,3,2,5,12,21)
mydata=data.frame(zone_id,v1,v2,v3,v4)

我有一个数据框,可以使用上面的代码来制作一个粗略的模型。它由与地理区域相关的数据行组成。我有一些变量(在这个例子中是4个,在我的实际数据集中是69个),其中包含整数,这些整数是这些区域的观测值。
对于每个zone_id,我想要确定从V1到V4中包含最大值的变量。如果存在并列情况,则希望返回包含并列最大值的每个变量的名称。因此,对于zone 1,我想要返回V4,对于zone 2,我想要返回V1和V2等等。
我非常新手R,并且无法解决这个问题。我已经查看了R帮助文件,并认为可能有一种使用sweep的解决方案?任何帮助将不胜感激。
2个回答

3
您可以在这里使用which(x == max(x))习语,并使用apply()对每一行运行它:
apply(mydata[, -1], 1, function(x) which(x == max(x)))

这将给出:

> apply(mydata[, -1], 1, function(x) which(x == max(x)))
[[1]]
v4 
 4 

[[2]]
v1 v2 
 1  2 

[[3]]
v1 
 1 

[[4]]
v2 
 2 

[[5]]
v2 
 2 

[[6]]
v2 v4 
 2  4

该列表包含索引向量中的变量最大值,并且可以使用names()提取这些向量的名称来给出实际的变量ID:

> out <- apply(mydata[, -1], 1,  function(x) which(x == max(x)))
> names(out[[2]])
[1] "v1" "v2"
> lapply(out, names)
[[1]]
[1] "v4"

[[2]]
[1] "v1" "v2"

[[3]]
[1] "v1"

[[4]]
[1] "v2"

[[5]]
[1] "v2"

[[6]]
[1] "v2" "v4"

如果您的数据可能包含NA,那么我们需要更加聪明一些,例如:

apply(mydata[, -1], 1, 
      function(x, na.rm = FALSE)
          which(x == max(x, na.rm = na.rm)),
      na.rm = TRUE)

我们可以传入参数来决定是否忽略 NA


1
@PaulHiemstra 我没有选择 which.max() 的原因是 OP 想要返回所有索引,如果存在并列的最大值。which.max() 返回第一个遇到的最大值,这就是它和 which(x == max(x)) 版本的差异所在。确切地说,在 x 中不存在相同值时,which.max(x) 仅等价于 which(x == max(x)) - Gavin Simpson
这两个答案都返回了我需要的数据,非常感谢你们两个。顺便问一下,有没有办法将它们作为表格返回?这些数据将需要用于另一组分析。 - gavinr
好的,那解释得很清楚。谢谢。 - Paul Hiemstra
@roman,看起来相当让人上瘾。我还没有发现很多关于R的东西。谢谢你的提示。 - Paul Hiemstra
@gavinr 不是很简单,你需要使用NA将列表组件填充到最长组件的长度。这是可以做到的,但取决于你接下来想要用它们做什么。最好将列表保留为原样,并对列表进行单独的分析。如果需要帮助,请提出另一个问题。 - Gavin Simpson
显示剩余2条评论

2

一种方法是使用rank。请注意数据前的负号,因为默认排序是从低到高。

x <- apply(-mydata[,-1],1,rank,ties.method="min")
x
   [,1] [,2] [,3] [,4] [,5] [,6]
v1    4    1    1    2    4    3
v2    3    1    2    1    1    1
v3    2    3    3    3    3    3
v4    1    4    4    4    2    1

您可以使用sapply提取名称:

sapply(mydata$zone_id,function(y) rownames(x)[x[,y]==1])
[[1]]
[1] "v4"

[[2]]
[1] "v1" "v2"

[[3]]
[1] "v1"

[[4]]
[1] "v2"

[[5]]
[1] "v2"

[[6]]
[1] "v2" "v4"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接