如何在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
相关产品推荐
相关产品推荐

