Возвращение столбцов, содержащих максимальные значения по всем переменным во фрейме данных - PullRequest
4 голосов
/ 20 января 2012
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, которая содержит максимальное значение.Там, где есть связь, я хочу вернуть имена каждой из переменных, которые содержат связанное максимальное значение.Поэтому для зоны 1 я хочу вернуть V4, для зоны 2 я хочу вернуть V1 и V2 и т. Д.

Я очень плохо знаком с R и не смог добраться до первой базы с этим.Я изучил файлы справки R и подумал, что может быть решение с использованием развертки?Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вы можете использовать здесь идиому 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(), чтобы дать действительный идентификатор переменной:

> 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 или нет.

2 голосов
/ 20 января 2012

Один из методов - использовать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...