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

如何在R中基于另一DataFrame的条件填充数据并实现列转行?

R实现DataFrame补全与行列转换

一、基于df1补全df2的Location列

根据需求,提取df1中D == "inside"的行,将指定数值列(示例为1-4,实际为5-100)的"1"转为"I"、"0"转为"O",并填充到df2对应的xxx_Location列中,且每个A分组下的所有行使用相同的填充值。

实现代码

# 提取df1中D为"inside"的目标行
inside_rows <- df1[df1$D == "inside", ]

# 筛选出需要处理的数值列(排除A/B/C/D列)
num_cols <- setdiff(colnames(df1), c("A", "B", "C", "D"))

# 转换数值列为I/O格式,并命名为xxx_Location
location_data <- lapply(num_cols, function(col) {
  ifelse(inside_rows[[col]] == "1", "I", "O")
})
names(location_data) <- paste0(num_cols, "_Location")

# 将转换后的数据填充到df2中,每个A分组的所有行复用同一组值
df2[names(location_data)] <- lapply(location_data, function(val) {
  rep(val, times = nrow(df2) / length(unique(df2$A)))
})

二、将宽表转换为长表得到df3

借助tidyr和dplyr包,把df2中的多列数值和Location列转换为行结构,得到目标df3。

实现代码

library(tidyr)
library(dplyr)

# 拆分数值列并转为长表
value_long <- df2 %>%
  select(A, B, C, D, all_of(num_cols)) %>%
  pivot_longer(
    cols = all_of(num_cols),
    names_to = "H",
    values_to = "Value"
  ) %>%
  mutate(Value = as.numeric(Value))

# 拆分Location列并转为长表
location_long <- df2 %>%
  select(A, B, C, D, all_of(paste0(num_cols, "_Location"))) %>%
  pivot_longer(
    cols = all_of(paste0(num_cols, "_Location")),
    names_to = "H",
    values_to = "Location",
    names_pattern = "(\\d+)_Location" # 提取列名中的数字部分作为H
  )

# 合并长表并调整列顺序
df3 <- inner_join(value_long, location_long, by = c("A", "B", "C", "D", "H")) %>%
  select(H, A, B, C, D, Value, Location) %>%
  arrange(D, H)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:12:20