如何用指定列表值替换R数据框中值为"na"的单元格?
问题需求
现有如下R数据框,需要将GROUP列中值为"na"的单元格,依次替换为name.col = c("1","2","3")中的对应元素(第1个"na"替换为"1",第2个替换为"2",第3个替换为"3")。
原始数据框代码:
data <- structure(list(GROUP = c("na", "3 N=0 (0%)", "na", "3 N=9 (100%)", "na", "3 N=9 (100%)"), col6 = c(NA, "NA", NA, "4.5 [2.5; 6.5] 4.67 ± 2.5 ( 2 - 8 )", NA, "NA"), col7 = c(NA, "NA", NA, "7.5 [6.25; 9.5] 7.83 ± 2.32 ( 5 - 11 )", NA, "NA"), col8 = c(NA, "NA", NA, "9.5 [8.25; 11.5] 9.83 ± 2.32 ( 7 - 13 )", NA, "NA"), dif = c(NA, "col6-col7: NA col6-col8: NA col7-col8: 0 [0; 310.5]", NA, "col1-col2: -3 [-3; -3] -1.29 [-2.32; -0.26] col1-col3: -5 [-5; -5] -1.74 [-2.84; -0.63] col2-col3: -2 [-2; -2] -0.42 [-1.36; 0.51]", NA, "col8-col6: NA col8-col7: 0 [0; 310.5] col6-col7: NA"), p.value = c(NA, "col6-col7: NA col6-col8: NA col7-col8: >0.999", NA, "col1-col2: 0.015* col1-col3: 0.008* col2-col3: 0.020*", NA, "col8-col6: NA col8-col7: >0.999 col6-col7: NA")), row.names = c(NA, 6L), class = "data.frame")
原代码的问题
你之前的代码循环遍历的是数据框的列(1:ncol(data)),但实际需要处理的是GROUP列中值为"na"的行,逻辑匹配错误,导致无法完成替换。
正确实现方式
方法一:逻辑索引(简洁高效)
直接定位GROUP列中值为"na"的行,批量赋值:
name.col <- c("1","2","3") # 筛选GROUP列值为"na"的行索引 na_rows <- which(data$GROUP == "na") # 给这些行的GROUP列赋值对应name.col元素 data$GROUP[na_rows] <- name.col
方法二:循环行(直观易懂)
如果偏好循环写法,遍历每行并判断替换:
name.col <- c("1","2","3") # 记录当前要使用的name.col元素索引 current_idx <- 1 for(i in 1:nrow(data)){ if(data$GROUP[i] == "na"){ data$GROUP[i] <- name.col[current_idx] current_idx <- current_idx + 1 } }
执行后,data$GROUP的结果为:c("1", "3\nN=0 (0%)", "2", "3\nN=9 (100%)", "3", "3\nN=9 (100%)"),符合需求。
内容的提问来源于stack exchange,提问作者GOGA GOGA
相关产品推荐
相关产品推荐

