R语言强制用For Loop提取每行最后非NA值并生成指定数据框
解决R语言用For Loop提取每行最后一个非NA值的问题
我来帮你调整代码,完美实现你需要的结果!首先明确你的核心需求:必须用for loop循环,从数据框每行提取最后一个非NA值,并生成指定结构的结果表。
先构造示例数据框
首先我们还原你给出的示例数据:
df <- data.frame( col1 = c("A", "B", "D"), col2 = c(NA, "C", "E"), col3 = c(NA, NA, "F"), col4 = c(NA, NA, NA), stringsAsFactors = FALSE )
修正后的For Loop代码
你之前的代码用到了data.table的.SD语法,但如果你的数据是普通data.frame的话会出现兼容性问题,而且没有把零散的打印结果整理成目标数据框。下面是调整后的可行代码:
# 初始化一个空的结果数据框,提前指定列名和数据类型 result_df <- data.frame(Product = character(), ColName = character(), stringsAsFactors = FALSE) # 遍历数据框的每一行 for (i in 1:nrow(df)) { # 获取当前行所有非NA值对应的列索引 non_na_cols <- which(!is.na(df[i, ])) # 取最后一个非NA值的列索引 last_non_na_idx <- max(non_na_cols) # 提取对应的值和列名 product_value <- df[i, last_non_na_idx] col_name <- colnames(df)[last_non_na_idx] # 将当前行的结果添加到结果数据框中 result_df[i, ] <- list(Product = product_value, ColName = col_name) } # 查看最终结果 print(result_df)
运行结果
执行后会得到你想要的预期输出:
Product ColName 1 A col1 2 C col2 3 F col3
代码说明
- 提前初始化结果数据框,避免循环中动态扩容带来的效率问题
- 用
which(!is.na(df[i, ]))精准定位当前行非NA值的列位置,再通过max()拿到最后一个非NA的索引 - 分别提取对应的值和列名,逐行填充到结果数据框中,保证结构和预期一致
内容的提问来源于stack exchange,提问作者Mr369
相关产品推荐
相关产品推荐

