Выберите несколько значений из кадра данных, используя матрицу с индексами - PullRequest
3 голосов
/ 19 сентября 2011

У меня есть цикл for, который возвращает мне значения из одного фрейма данных, используя которого, which.min и which.max, давая мне «координаты».Вот пример

df <- as.data.frame(matrix(rnorm(11284), nrow=403, ncol=28))
row <- matrix(data=c(1:403),nrow=403, ncol=1)
col <- matrix(rnorm(403,14,3), nrow=403, ncol=1)
col <- round(col, 0)
coord <- cbind(row, col)

Coord содержит координаты для критерия, который я определил ранее.Теперь я хочу извлечь соответствующие значения в соответствии с этими координатами из df с помощью цикла for

for (i in 1:nrow(coord)) {
print(df[coord[i,1], coord[i,2]])
}

Когда я использую

output <- df[coord[i,1], coord[i,2]])

, это дает мне только последнее выражение цикла.Теперь мой простой вопрос: как мне сохранить не только последнее выражение из этого цикла, но и весь вектор, который мне дал print?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Ты удивлен?Вы сохраняете каждый цикл только одно значение цикла в выводе.Так что после последнего цикла это только последнее значение.Правильное решение цикла было бы:

output <- vector(length=nrow(coord))
for (i in 1:nrow(coord)){
    output[i] <- df[coord[i,1],coord[i,2]]
}

Но вам не нужно использовать цикл.Если у вас есть координаты в кадре данных или в матрице, это все равно можно сделать намного проще:

output <- Df[coord]

Не требуется цикл.

0 голосов
/ 19 сентября 2011

Это немного похоже на то, как раньше использовался OP SAS, в R переменные не имеют истории. Вместо построчной операции в R люди пытаются выполнять вычисления на основе вектора и использовать apply, чтобы применить функцию к каждой записи в векторе или матрице. В более условных случаях вы можете использовать цикл for и сохранять возвращаемые значения как записи внутри него, а затем возвращать или распечатывать их все сразу:

my <- function() {
    outputs <- rep(0,20)
    for(i in 1:20) {
        outputs[i] <- i*i
    }
return(outputs)
}
...