如何用R(优先tidyverse)按标记行合并事件多行为单行
用tidyverse实现事件数据的行合并
步骤说明
因为你已经手动为每个变量标记了需要保留的行,我们可以直接按事件分组,提取每个标记为Y的变量值,最终合并为每行一个事件的结构。
示例代码
首先加载tidyverse包,构造示例输入数据(你可以替换成自己的数据集):
library(tidyverse) # 示例输入数据(模拟你的数据集结构) input_data <- tibble( Event = c("E1", "E1", "E1", "E2", "E2"), Area = c("A1", "A2", "A3", "A4", "A5"), Keep_area = c("N", "Y", "N", "N", "Y"), Date = c("2023-01-01", "2023-01-02", "2023-01-03", "2023-02-01", "2023-02-02"), Keep_dat = c("Y", "N", "N", "Y", "N"), Outcome = c("Success", "Failure", "Pending", "Success", "Pending"), Keep_out = c("N", "N", "Y", "N", "Y") )
执行数据合并操作:
# 核心处理代码 output_data <- input_data %>% group_by(Event) %>% summarize( # 提取每个事件中标记为Y的Area值 Area = first(Area[Keep_area == "Y"]), # 提取每个事件中标记为Y的Date值 Date = first(Date[Keep_dat == "Y"]), # 提取每个事件中标记为Y的Outcome值 Outcome = first(Outcome[Keep_out == "Y"]) ) %>% ungroup() # 查看最终结果 print(output_data)
结果说明
运行后会得到如下结构的输出(每个事件一行,对应标记行的变量值):
# A tibble: 2 × 4 Event Area Date Outcome <chr> <chr> <chr> <chr> 1 E1 A2 2023-01-01 Pending 2 E2 A5 2023-02-01 Pending
注意事项
- 如果你的标记列是**逻辑值(TRUE/FALSE)**而非字符"Y"/"N",只需将代码中的
Keep_area == "Y"改为Keep_area即可。 - 确保每个事件的每个标记列(Keep_area/Keep_dat/Keep_out)只有一个
Y,这样first()能准确提取到唯一的目标值;如果有多个Y,可以根据需求替换为last()或其他聚合方式,也可以添加警告提示重复标记。
内容的提问来源于stack exchange,提问作者mimkat
相关产品推荐
相关产品推荐

