基于另一DataFrame的ID频率值删除目标DataFrame的行
解决方法
先明确数据
原始数据df:
df <- structure(list(ID = c(123L, 123L, 123L, 555L, 555L, 555L), City = c("NEW YORK", "NEW YORK", "NEW YORK", "Los Angeles", "Los Angeles", "Los Angeles" )), class = "data.frame", row.names = c(NA, -6L))
频率表df2:
df2 <- structure(list(ID = c(123L, 555L), Freq = 2:1), class = "data.frame", row.names = c(NA, -2L))
方法1:用dplyr包(简洁直观)
先加载dplyr,两步完成筛选:
library(dplyr) # 第一步:找出要保留的ID(Freq=1的那些) keep_ids <- df2 %>% filter(Freq == 1) %>% pull(ID) # 第二步:过滤原始df,只留符合条件的行 result_df <- df %>% filter(ID %in% keep_ids)
也可以连写一步到位:
result_df <- df %>% left_join(df2, by = "ID") %>% # 把频率信息关联到原始数据 filter(Freq == 1) %>% # 只保留Freq=1的行 select(-Freq) # 删掉Freq列,还原原数据结构
方法2:用Base R(无需额外安装包)
不想装dplyr的话,用基础R函数也能搞定:
# 提取要保留的ID keep_ids <- df2$ID[df2$Freq == 1] # 过滤原始数据框 result_df <- df[df$ID %in% keep_ids, ]
验证结果
运行后result_df会只保留ID=555的3行数据,完全符合需求。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

