Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要将for循环的结果保存到数据帧中_R_Rbind - Fatal编程技术网

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

我需要将for循环的结果保存到数据帧中,r,rbind,R,Rbind,所以,我有一个for循环,在这个循环中,我在一个数字的数据帧中循环。 我的要求是提取数据帧中大于1的所有值对(rowid、columnid) 我尝试使用rbind,但在不匹配的维度上出错。 当我对row和column使用rbind两次时,它似乎在粘贴/追加相同的rowid。它在某个时候被覆盖了,但我不知道在哪里 for loop through nrow of matt { rowsneeded <- which(matt[i, ] >1) if (length(rowsneed

所以,我有一个for循环,在这个循环中,我在一个数字的数据帧中循环。 我的要求是提取数据帧中大于1的所有值对(rowid、columnid)

我尝试使用rbind,但在不匹配的维度上出错。 当我对row和column使用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])))
}
}
在for循环的末尾,我需要以下格式的列表或数据帧对象: 条件为:所有值均大于1 所以


我可以稍后从结果中删除重复项,但第一步是将for循环的结果转换为可处理的格式。

我们可以使用
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
mat 0,arr.ind=TRUE)
data.frame(行=行名(matt)[mat[,1]],
col=colnames(mat)[mat[,2]],
值=亚光[mat])
#行列值
#1类3类1类2
#2类3类2类3
#3类1类3类2
#4第2类第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"))

matt我们可以通过
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
转换为
对象,然后使用
as.data.frame

subset(as.data.frame(as.table(as.matrix(matt))), Freq != 0)
数据
matt谢谢你,Ronak。使用structure(),可以动态创建df吗?我的结果将是数百个这样的(行、列)对,我需要提取它们。因此,我需要创建的数据框不能有预定义的维度。@Sup我没有预定义任何维度。我用了
df
,我想在你的情况下是
matt
。谢谢。我确实有一个问题,抱歉,如果它太基本了。使用which()在嵌套for的每一列和每一行中循环时,似乎可以提供更多的控制,原因是什么?比如,我发现自己倾向于创建一个row对象并绑定到我的results dataframe。你完全可以这样做,但是R有许多函数专门设计来避免像本例中那样的显式
for
循环。你对每一行都做
which(matt[i,]>1)
,但基本上如果你做
which(matt>1)
你会得到相同的结果,但对整个矩阵没有
for
循环。是的,因为有了which(matt>1),我会按列得到它。也就是说,多行匹配第一列,然后是第二列,等等。我希望它跨列匹配我的第一行。因此,我应该选择哪个(matt[,I]>1),哪个是明确的,对吗?
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
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"))