如何用dplyr基于外部数据框LC列过滤R数据框?
解决R数据框过滤后为空的问题
问题场景
现有两个R数据框:
- lc.dc:仅包含
LC列,存着56个唯一观测值,示例数据如下:
# DF 1 LC <- c("A", "B", "C") lc.dc <- data.frame(LC) # 输出结果 LC 1 A 2 B 3 C
- da.df:包含多列,其中
LC列有500条观测值,示例数据如下:
# DF 2 DA <- c(44, 22, 56,20, 34, 45, 22, 55) LC <- c("A","C","W", "Z", "B","H","B","A") da.df <- data.frame(DA, LC) # 输出结果 DA LC 1 44 A 2 22 C 3 56 W 4 20 Z 5 34 B 6 45 H 7 22 B 8 55 A
需求是过滤da.df,只保留LC列值存在于lc.dc$LC中的行。但用户尝试的代码返回了空数据框:
# Convert Unique LC to list LC.char <- lc.dc$LC StringLC <- list(LC.char) # Apply filter using dplyr to fetch a new DF with only the unqique LCs da.df.filtered <- da.df %>% filter(LC. %in% c(StringLC))
错误原因
- 多余的列表转换:把
LC.char转成列表StringLC后,c(StringLC)并不会将其转回普通向量,而是得到一个嵌套的列表结构,%in%无法在列表和字符值之间做匹配。 - 列名笔误:
filter里写的LC.是错误的,正确列名是LC(多了一个不必要的点)。
正确实现方法
方法1:dplyr简洁写法
直接用lc.dc$LC作为匹配向量,不需要额外转成列表:
library(dplyr) da.df.filtered <- da.df %>% filter(LC %in% lc.dc$LC)
运行后得到的结果:
DA LC 1 44 A 2 22 C 3 34 B 4 22 B 5 55 A
方法2:基础R写法
不用dplyr的话,用基础R的subset函数也能实现:
da.df.filtered <- subset(da.df, LC %in% lc.dc$LC)
方法3:提前提取匹配向量(可选)
如果需要单独保存匹配用的向量,直接保留向量格式即可,别转列表:
valid_LC <- lc.dc$LC # 直接是字符向量,不是列表 da.df.filtered <- da.df %>% filter(LC %in% valid_LC)
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

