使用dplyr的filter函数筛选数据时仅获半数结果的问题
问题
基于数据框的Site列筛选分类变量,每个Site对应4个重复样本,但使用dplyr的filter(Site == c("D1", "D2"))时,每个Site仅能筛选出2个样本,而非全部4个。相关代码及数据结构如下:
library(reshape2) library(dplyr) # 数据结构 temp <- structure(list(Site = c("D1", "D1", "D1", "D1", "D2", "D2", "D2", "D2", "F1", "F1", "F1", "F1", "F2", "F2", "F2", "F2", "M1", "M1", "M1", "M1"), Sep = c(5.000073346, 3.959014012, 3.293763823, 3.691402517, 2.331956761, 1.706711937, 1.908240947, 1.028182648, 4.529929612, 3.542390533, 2.939488955, 4.357789131, 3.438225736, 3.745902617, 5.006819729, 4.835158618, 1.688684287, 3.76575182, 4.41881884, 3.091332154), Nov = c(3.661118088, 3.429289484, 3.727159765, 2.941506698, 4.589052659, 3.476037698, 4.869238327, 5.09252411, 4.84755279, 4.412475932, 4.962210935, 4.120248823, 4.278072155, 3.323072893, 4.23765943, 4.392650181, 6.537290992, 5.454052109, 5.563769396, 5.029513255), Dec = c(2.725587179, 2.381721043, 2.954327194, 5.951367491, 4.016579621, 4.326848239, 2.715851017, 3.182048124, 3.263315117, 3.078857534, 4.265684687, 3.721142837, 4.512466653, 4.566376267, 4.376168567, 5.55052848, 3.703677353, 4.602167364, 3.551786977, 4.415803806), Jan = c(3.724458911, 3.034607481, 6.72964007, 6.326052718, 4.171555318, 3.694165984, 3.953549478, 4.286563553, 3.41785333, 3.721709052, 3.22124755, 3.928655276, 3.414445646, 5.058962226, 3.651320936, 3.741088766, 4.196781314, 4.369725593, 4.145079877, 3.184780363), Feb = c(6.745170054, 7.352911087, 7.741699775, 8.182030811, 8.755400406, 8.558035917, 8.566876746, 7.70288498, 8.490014131, 8.938007492, 8.829804785, 8.721657438, 8.899878788, 8.779723397, 8.713334344, 8.674256229, 8.190509755, 8.108222026, 8.291649608, 8.247579639), Mar = c(NA, NA, NA, NA, 8.522471451, 8.646157668, 8.358017328, 8.678741134, 8.226830861, 8.369260043, 8.533309823, 8.504808088, 8.446866416, 8.505756134, 8.307329127, 8.560433823, 8.543567215, 8.399864287, 8.249789998, 8.422344932), May = c(7.750943712, 7.324172115, 7.312871004, 7.703756414, 8.439276583, 8.248980267, 8.46252326, 8.412239273, 8.056875878, 8.555806759, 8.624501669, 7.063735469, 8.617594132, 8.589217713, 8.539833666, 8.502679138, 8.29096815, 8.141877574, 8.157477163, 7.876765458), Jun = c(7.626713405, 8.007669163, 7.222288605, 7.465691973, 7.824387481, 8.210107218, 8.069113283, 8.245466763, 7.914699549, 7.949417951, 8.128795224, 8.583682627, 7.876767066, 8.391772077, 8.550253971, 8.327921168, 8.334774733, 8.22367216, 8.408981968, 8.203493332), Jul = c(8.326947736, 8.355575056, 7.875764906, 8.310696912, 8.019477682, 7.584616989, 8.316133836, 8.397618283, 7.550298595, 7.86967247, 8.26234058, 7.993976432, 8.160564088, 8.200782219, 8.347735469, 8.420816081, 8.306481377, 8.433985705, 7.919345864, 8.044328046), Aug = c(8.142273504, 7.964492373, 7.895485291, 7.807633741, 8.521885142, 8.392313733, 8.16247034, 8.360945835, 7.319490413, 8.091081007, 8.13651625, 7.562991315, 8.544818165, 8.863674948, 8.456135212, 8.532886985, 8.122734654, 8.472749159, 8.181808244, 8.557766942)), class = "data.frame", row.names = c(NA, -20L)) temp_melt = melt(temp, id = c("Site")) # 每个Site对应4个月份样本 temp_melt$variable <- factor(temp_melt$variable,levels=unique(temp_melt$variable)) dsite <- temp_melt %>% filter(Site == c("D1", "D2")) # 仅筛选出每个Site的2个样本
原因分析
==是逐元素匹配运算符,R会将Site列的每个元素与向量c("D1","D2")循环对齐进行匹配:
- 对于
Site列的前4个D1,会依次匹配D1、D2、D1、D2,只有第1、3个D1匹配成功; - 对于接下来的4个
D2,同样依次匹配D1、D2、D1、D2,只有第2、4个D2匹配成功;
最终每个Site仅保留2个样本。
解决方法
使用%in%运算符替代==,%in%用于判断元素是否属于某个集合,会检查Site的每个元素是否在c("D1","D2")中,而非逐元素循环匹配:
dsite <- temp_melt %>% filter(Site %in% c("D1", "D2"))
执行后可正确筛选出每个Site的全部4个样本,筛选F1、F2时同样适用此方法。
内容的提问来源于stack exchange,提问作者no_frills_30
相关产品推荐
相关产品推荐

