我需要将for循环的结果保存到数据帧中
所以,我有一个for循环,在这个循环中,我在一个数字的数据帧中循环。 我的要求是提取数据帧中大于1的所有值对(rowid、columnid) 我尝试使用rbind,但在不匹配的维度上出错。 当我对row和column使用rbind两次时,它似乎在粘贴/追加相同的rowid。它在某个时候被覆盖了,但我不知道在哪里我需要将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 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"))