R中按条件提取数据框行列名组合的循环索引计算问题
核心逻辑说明
你给出的预期SD是按列优先顺序遍历原数据框的所有单元格填充的,对应k的计算公式为:k = (j-1)*nrow(DF) + i,其中j是列序号、i是行序号。
修正后可运行的循环代码
# 修正原数据框定义语法,避免生成多余全局变量 DF <- data.frame(A = c(5, 8, 2), B = c(2, 4, 8), C = c(1, 2, 1), row.names = c("A", "B", "C")) SD <- data.frame(RowNames = rep(NA,9), ColumnNames = rep(NA,9)) # 调整循环顺序为外层遍历列、内层遍历行,匹配你期望的填充顺序 for(j in 1:ncol(DF)) { for(i in 1:nrow(DF)) { # 计算当前单元格对应的SD行号k k <- (j-1)*nrow(DF) + i # 仅当值等于2时赋值,默认SD已经是NA无需重复赋值 if(DF[i,j] == 2) { SD[k, 1] <- rownames(DF)[i] SD[k, 2] <- colnames(DF)[j] } } }
运行上述代码得到的SD和你给出的预期结果完全一致。
更简洁的向量化实现(无需循环)
如果不用循环,你可以直接用which定位符合条件的单元格位置,再批量赋值,代码更高效易读:
DF <- data.frame(A = c(5, 8, 2), B = c(2, 4, 8), C = c(1, 2, 1), row.names = c("A", "B", "C")) SD <- data.frame(RowNames = rep(NA,9), ColumnNames = rep(NA,9)) # 定位值等于2的单元格的行、列索引 pos <- which(DF == 2, arr.ind = TRUE) # 计算对应SD的行号k k <- (pos[,"col"]-1)*nrow(DF) + pos[,"row"] # 批量赋值 SD$RowNames[k] <- rownames(DF)[pos[,"row"]] SD$ColumnNames[k] <- colnames(DF)[pos[,"col"]]
内容的提问来源于stack exchange,提问作者JMeelis
相关产品推荐
相关产品推荐

