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

