说,我有一个数据框,我需要对其细胞做一些事情,并记住我改变了哪些细胞。一种方法是使用两个for循环遍历索引。但有没有办法用一个循环来做到这一点?
完全我需要这样的东西:
changes = data.frame(Row = character(), Col = character())
for (cell in df){
if (!(is.na(df))){
cell = do.smt(cell)
temp = list(Row = get.row(cell), Col = get.col(cell))
changes = rbind(changes,temp)
}
}
我需要的例子:
df = data.frame(A = c(1,2,3), B = c(4,5,6), C = c(7,8,9))
rownames(df) = c('a','b','c')
changes = data.frame(Row = NA, Col = NA)
for (i in rownames(df)){
for (j in colnames(df)) {
if (df[i,j] > 5) {
df[i,j] = 0
temp = list(Row = i, Col = j)
changes = rbind(changes, temp)
}
}
}
答案 0 :(得分:2)
这摆脱了两个循环
df = data.frame(A = c(1,2,3), B = c(4,5,6), C = c(7,8,9))
rownames(df) = c('a','b','c')
changes <- which(df > 5, arr.ind=TRUE)
df[changes] <- 0
如果您希望格式完全符合指定,则可以使用
对其进行排序changes <- data.frame(changes,row.names=NULL)
changes$row <- rownames(df)[changes$row]
changes$col <- colnames(df)[changes$col]
如果您担心行的顺序与您的示例输出匹配,那么这是一个简单的排序问题