因此,我有一个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循环的结果转换为可处理的格式。
答案 0 :(得分:1)
我们可以将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"))
答案 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"))