Мне нужно сохранить результаты цикла for в датафрейм - PullRequest
1 голос
/ 08 октября 2019

Итак, у меня есть цикл for, в котором я перебираю циклы данных чисел. Мое требование состоит в том, чтобы извлечь все те пары (rowid, columnid) значений в кадре данных, которые больше 1.

Я пытался использовать rbind, но получаю ошибку о несоответствующих измерениях. И когда я дважды использую rbind для строки и столбца, кажется, что он вставляет / добавляет один и тот же rowid через througout. В какой-то момент он перезаписывается, но я не могу понять, где.

for loop through nrow of matt {
rowsneeded <- which(matt[i, ] >1)
  if (length(rowsneeded ) > 0) {
    resultsdf<-rbind(resultsdf, c(i, rownames(matt[i, findrows, drop = FALSE])))
   resultsdf<-rbind(resultsdf, c(i, colnames(matt[i, findrows, drop = FALSE])))
}
}

Что мне нужно:

      cat1 cat2 cat3 
cat1   0    0     2
cat2   0    0     3
cat3   2    3     0

В конце цикла for мне нужен список илиобъект dataframe в следующем формате: условие: все значения больше 1 Итак,

(cat1, cat3)
(cat2, cat3)
(cat3, cat2)

Позже я могу удалить дубликаты из результатов, но первым шагом будет получение результатов моегоцикл for в обрабатываемый формат.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Мы можем использовать which с arr.ind = TRUE, чтобы получить индекс строки / столбца, где значение больше 0. Затем создайте новый фрейм данных, чтобы получить имена строк и имена столбцов извлеченного индекса.

mat <- which(matt > 0, arr.ind = TRUE)

data.frame(row = rownames(matt)[mat[, 1]], 
           col = colnames(matt)[mat[, 2]], 
           value = matt[mat])

#   row  col value
#1 cat3 cat1     2
#2 cat3 cat2     3
#3 cat1 cat3     2
#4 cat2 cat3     3

данные

matt <- structure(list(cat1 = c(0L, 0L, 2L), cat2 = c(0L, 0L, 3L), cat3 = c(2L, 
3L, 0L)), class = "data.frame", row.names = c("cat1", "cat2", "cat3"))
0 голосов
/ 08 октября 2019

Мы можем сделать это очень легко, melt используя matrix

library(reshape2)
library(dplyr)
matt %>%
    as.matrix %>%
    melt %>% 
    filter(value != 0)
#  Var1 Var2 value
#1 cat3 cat1     2
#2 cat3 cat2     3
#3 cat1 cat3     2
#4 cat2 cat3     3

или используя base R путем преобразования в table объект и затем обертываем as.data.frame

subset(as.data.frame(as.table(as.matrix(matt))), Freq != 0)

данные

matt <- structure(list(cat1 = c(0L, 0L, 2L), cat2 = c(0L, 0L, 3L), cat3 = c(2L, 
3L, 0L)), class = "data.frame", row.names = c("cat1", "cat2", 
"cat3"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...