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

如何在R语言DataFrame中按股票计算买卖盈亏?

问题描述

我有一个包含股票代码(tiker)、买卖类型(boughtSold)和价格(price)的DataFrame,记录了股票的买入和卖出情况。希望按股票分组,用卖出总价减去买入总价计算盈亏。

已尝试的代码:

tiker <- c("stock1", "stock2", "stock3",
           "stock2", "stock1", "stock3",
           "stock3", "stock1", "stock1")

boughtSold <- c("sold", "bought", "sold",
               "sold", "sold", "bought",
               "bought", "sold", "bought")

price <- c(12, 14, 5,
           7, 14, 9,
           32, 21, 9)

stocks_df <- data_frame(tiker, boughtSold, price)

df1 <- stocks_df %>% 
  group_by(tiker, boughtSold) %>% 
  summarise(sum(price))

当前代码已统计出各股票的买入总价和卖出总价(如stock1买入9,卖出47),但不知道如何添加盈亏列展示结果。


解决方案

方法一:转宽表后计算盈亏

先将长格式的统计结果转为宽格式,让买入、卖出总价成为单独列,再直接计算盈亏:

library(tidyverse)

# 统计各股票买卖总价并命名列
df_summary <- stocks_df %>% 
  group_by(tiker, boughtSold) %>% 
  summarise(total = sum(price), .groups = "drop") %>% 
  # 转宽表,缺失的买卖类型用0填充
  pivot_wider(names_from = boughtSold, values_from = total, values_fill = 0) %>% 
  # 计算盈亏:卖出总价 - 买入总价
  mutate(profit_loss = sold - bought)

print(df_summary)

运行后会得到包含tiker、bought、sold、profit_loss的结果表,无对应交易的类型会自动补0(比如某股票只有买入记录,sold列值为0)。

方法二:分组后直接计算(无需转宽表)

如果不需要保留买入/卖出的单独统计列,可直接在分组时完成求和与盈亏计算:

df_profit <- stocks_df %>% 
  group_by(tiker) %>% 
  summarise(
    total_bought = sum(price[boughtSold == "bought"]),
    total_sold = sum(price[boughtSold == "sold"]),
    profit_loss = total_sold - total_bought
  )

print(df_profit)

此方法一步完成所有计算,结果更紧凑。

方法三:基于现有df1改造

如果想在你已得到的df1基础上继续处理,先给求和列命名,再转宽计算:

# 先给df1的求和列添加名称
df1 <- stocks_df %>% 
  group_by(tiker, boughtSold) %>% 
  summarise(total_price = sum(price), .groups = "drop")

# 转宽并计算盈亏
df_result <- df1 %>% 
  pivot_wider(names_from = boughtSold, values_from = total_price, values_fill = 0) %>% 
  mutate(profit_loss = sold - bought)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:30:58