如何对分组后的DataFrame每两行应用自定义函数?
解决方案
假设你的tibble每个ID分组下恰好包含两行数据(对应一组Team组合),可以用dplyr的分组操作结合自定义函数来实现需求,具体步骤如下:
1. 示例数据与自定义函数
先构造模拟数据,并定义你的proprietary_function(这里以根据Price返回Team组合标识为例,你可以替换为自己的实际逻辑):
library(tibble) library(dplyr) # 模拟输入数据 sample_data <- tibble( ID = rep(1:3, each = 2), Team = c("A1", "B1", "A2", "B2", "A3", "B3"), Price = c(100, 150, 200, 250, 300, 350) ) # 自定义函数:传入两个Price值,返回对应的Team组合标识 proprietary_function <- function(p1, p2) { # 这里替换为你实际的函数逻辑,示例仅做演示 if (p1 == 100 && p2 == 150) { "A1B1" } else if (p1 == 200 && p2 == 250) { "A2B2" } else { "A3B3" } }
2. 分组生成New_Value列
通过group_by(ID)分组后,用mutate调用自定义函数,传入组内的两个Price值,函数返回的结果会自动赋值给组内的两行:
result <- sample_data %>% group_by(ID) %>% mutate( # 传入组内第一个和第二个Price值,生成New_Value New_Value = proprietary_function(Price[1], Price[2]) # 如果组内行顺序不确定,用first(Price)和last(Price)更稳妥 # New_Value = proprietary_function(first(Price), last(Price)) ) %>% ungroup() # 查看结果 print(result)
3. 处理异常分组(可选)
如果存在ID分组下行数不为2的情况,先过滤掉这些异常组:
filtered_data <- sample_data %>% group_by(ID) %>% filter(n() == 2) %>% ungroup() # 再对过滤后的数据执行上述分组赋值操作
说明
- 函数
proprietary_function的参数是组内的两个Price值,你可以根据实际需求编写逻辑,返回对应的Team组合标识(如A1B1)。 - 分组后
mutate会将函数结果应用到组内所有行,所以同一个ID下的两行会共享同一个New_Value。
内容的提问来源于stack exchange,提问作者Aaron Morris
相关产品推荐
相关产品推荐

