我需要将for循环的结果保存到数据框中

时间:2019-10-08 08:26:42

标签: r rbind

因此,我有一个for循环,其中循环了一个数字数据框。 我的要求是提取数据框中所有大于1的值对(rowid,columnid)。

我尝试使用rbind,但收到有关尺寸不匹配的错误。 当我对行和列两次使用rbind时,似乎正在粘贴/附加相同的rowid输出。在某个时候它被覆盖了,但是我不知道在哪里。

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 个答案:

答案 0 :(得分:1)

我们可以将whicharr.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"))

答案 1 :(得分:0)

我们可以通过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"))