You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:用对应列值替换数据框中1值单元格并生成5个数据框

问题与解决方案

需求说明

  • 现有R数据框记录植物样方数据:1代表植物存在,NA代表缺失;同时包含L、F、R、N、S五列数值列
  • 需要将所有以X开头的样方列中的1,分别替换为对应行的L/F/R/N/S列值,NA保持不变
  • 最终生成5个独立的数据框,每个数据框对应一种替换规则(比如替换为L列值的df_L,替换为F列值的df_F等)

原始数据结构

df <- structure(list(Species = c("Conocephalum conicum", "Mnium hornum", "Polytrichum formosum", "Oxalis acetosella", "Circaea lutetiana", "Geum urbanum"), Common.Name = c("Great Scented Liverwort", "Swan's-neck Thyme-moss", "Bank Haircap", "Wood Sorrel", "Enchanter's-nightshade", "Wood Avens"), L = c(3L, 4L, 4L, 4L, 4L, 4L), F = c(7L, 5L, 6L, 6L, 6L, 6L), R = c(6L, 4L, 3L, 4L, 7L, 7L), N = c(5L, 4L, 3L, 4L, 6L, 7L), S = c(0L, 0L, 0L, 0L, 0L, 0L), Source = c("Hill et al., 2007", "Hill et al., 2007", "Hill et al., 2007", "Hill et al., 1999", "Hill et al., 1999", "Hill et al., 1999"), X1_19 = c(NA, NA, NA, NA, NA, 1L), X1_20 = c(NA, NA, NA, NA, NA, 1L), X1_22 = c(NA, NA, NA, NA, NA, 1L), X2_19 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X2_20 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X2_22 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X3_19 = c(NA, NA, NA, NA, NA, 1L), X3_20 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X3_22 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X4_19 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X4_20 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X4_22 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X5_19 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X5_20 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X5_22 = c(NA, NA, NA, NA, NA, NA), X6_19 = c(NA, NA, NA, 1L, NA, NA), X6_20 = c(NA, NA, NA, NA, 1L, NA), X6_22 = c(NA, NA, NA, 1L, NA, NA), X7_19 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X7_20 = c(NA, NA, NA, NA, 1L, NA), X7_22 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X8_19 = c(1L, NA, 1L, NA, NA, NA), X8_20 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X8_22 = c(1L, NA, 1L, NA, NA, NA), X9_19 = c(NA, 1L, NA, NA, NA, NA), X9_20 = c(NA, 1L, NA, NA, NA, NA), X9_22 = c(NA, 1L, NA, NA, NA, NA)), row.names = c(NA, 6L), class = "data.frame")

实现代码

library(dplyr)
library(purrr)

# 筛选出所有以X开头的样方列
x_cols <- grep("^X", colnames(df), value = TRUE)

# 指定需要用来替换的目标列
target_cols <- c("L", "F", "R", "N", "S")

# 批量生成替换后的5个数据框,存入列表
result_list <- map(target_cols, function(col) {
  df %>%
    mutate(across(all_of(x_cols), ~ ifelse(.x == 1, !!sym(col), .x)))
})

# 为列表中的数据框命名,方便调用
names(result_list) <- paste0("df_", target_cols)

# 提取单个数据框(按需使用)
df_L <- result_list$df_L  # 替换为L列值的数据框
df_F <- result_list$df_F  # 替换为F列值的数据框
df_R <- result_list$df_R  # 替换为R列值的数据框
df_N <- result_list$df_N  # 替换为N列值的数据框
df_S <- result_list$df_S  # 替换为S列值的数据框

代码说明

  • grep("^X", colnames(df), value = TRUE):精准定位所有以X开头的样方列
  • purrr::map:遍历5个目标列,批量生成替换后的数据框,避免重复写代码
  • dplyr::mutate + across:对所有X列执行替换逻辑——仅当值为1时,替换为对应行目标列的数值,NA和其他值保持不变
  • 最终result_list列表中包含5个命名的数据框,可直接提取使用

内容的提问来源于stack exchange,提问作者Melanie Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:33:25