如何在R中基于两个数据框生成指定格式的新数据框?
解决方案
我们可以借助tidyverse工具包实现这两个需求,核心是先生成两个数据框的全交叉组合,再分别处理拼接和均值计算:
1. 生成new_df1:拼接名称
先通过cross_join得到df1和df2的所有行配对,再用str_c完成字符串拼接:
library(tidyverse) # 原数据框 df1 <- data.frame(Name = c("RIS_001", "RIS_002", "RIS_003", "RIS_004", "RIS_005")) %>% mutate(Value = c(5, 3, 8, 6, 9)) df2 <- data.frame(Prod = c("RIS_010", "RIS_011", "RIS_012", "RIS_013", "RIS_014", "RIS_015", "RIS_016", "RIS_017")) %>% mutate(Value = c(54, 87, 92, 48, 66, 35, 12, 18)) # 生成new_df1 new_df1 <- cross_join(df1, df2) %>% mutate(Combined = str_c(Name, Prod, sep = "|")) %>% select(Combined) # 仅保留拼接后的列,若需要原列可去掉这行 # 查看结果 head(new_df1)
运行后new_df1的每一行都是df1的Name和df2的Prod用|拼接后的字符串,比如RIS_001|RIS_010。
2. 生成new_df2:计算交叉均值
同样基于全交叉组合,直接计算两个Value列的均值:
# 生成new_df2 new_df2 <- cross_join(df1, df2) %>% mutate(Mean_Value = (Value.x + Value.y)/2) %>% select(Name, Prod, Mean_Value) # 保留配对名称和均值 # 查看结果(以RIS_001与RIS_010为例) filter(new_df2, Name == "RIS_001", Prod == "RIS_010")
这里Value.x是df1的数值,Value.y是df2的数值,计算结果和示例中的29.5一致。
如果偏好基础R实现,也可以用expand.grid完成:
# 基础R版本 cross_data <- expand.grid(Name = df1$Name, Prod = df2$Prod, stringsAsFactors = FALSE) cross_data$Value1 <- df1$Value[match(cross_data$Name, df1$Name)] cross_data$Value2 <- df2$Value[match(cross_data$Prod, df2$Prod)] # new_df1 new_df1_base <- data.frame(Combined = paste(cross_data$Name, cross_data$Prod, sep = "|")) # new_df2 new_df2_base <- cross_data %>% mutate(Mean_Value = (Value1 + Value2)/2) %>% select(Name, Prod, Mean_Value)
内容的提问来源于stack exchange,提问作者Sandeep Patil
相关产品推荐
相关产品推荐

