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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:05:59