2016-12-16 84 views
0

说,我有一个数据框,我需要对其单元格做些事情,并记住我已更改的单元格。一种方法是通过两个for-loop循环索引。但是有没有办法用一个循环来做到这一点?R:在通过df元素循环时获取索引名称

完美,我需要这样的:

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

也许与最终的DF比较初始DF。如果您的df是数字,则减去两者并检查哪些条目不等于0.您应该给我们提供您的数据样本。什么是smt? – Ansjovis86

+3

请给出一个有意义的最小工作示例和预期结果。我怀疑这可以在1行代码中解决(使用向量化方法)。 –

+0

@RomanLuštrik添加了示例 – lotrus28

回答

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] 

及其排序一件简单的事情,如果你关注的是,行的顺序符合您的示例输出

+0

非常感谢。这正是我一直在寻找的 – lotrus28