我正在查看一个数据框架,并尝试将具有相同压力值的行子集到5行以上,或者删除没有5个重复压力值的行.
File Turbidity Pressure
1 3.2 46
2 3.4 46
3 5.4 46
4 3.2 46
5 3.1 46
6 2.3 46
7 2.3 45
8 4.5 45
9 2.3 45
10 3.2 44
11 4.5 44
12 6.5 43
13 3.2 42
14 3.1 41
15 1.2 41
16 2.3 41
17 2.4 41
18 2.1 41
19 1.4 41
25 1.3 41
所以基本上试着让压力在46到41之间的行保持不变,并删除中间的行。这是我的数据集的一小部分,只需要代码,基本上保持5或更多重复压力值行,并删除其他。
发布于 2015-06-30 23:51:22
试一试
library(dplyr)
df %>% group_by(Pressure) %>% filter(n() >= 5)
这意味着:
#Source: local data frame [13 x 3]
#Groups: Pressure
#
# File Turbidity Pressure
#1 1 3.2 46
#2 2 3.4 46
#3 3 5.4 46
#4 4 3.2 46
#5 5 3.1 46
#6 6 2.3 46
#7 14 3.1 41
#8 15 1.2 41
#9 16 2.3 41
#10 17 2.4 41
#11 18 2.1 41
#12 19 1.4 41
#13 25 1.3 41
发布于 2015-07-01 00:14:01
这里有一个data.table
解决方案(关键是依赖于压力,而不是在后面重复):
library(data.table)
setDT(df)[,if(.N>=5) .SD,by=Pressure]
增编:
如果您期望Pressure
值稍后会重复,例如:
df<-data.frame(File=c(1:19,25:28),
Pressure=rep(c(46:41,46),c(6,3,2,1,1,7,3)))
然后,您将需要使用rleid
,以便只将至少5组组保持为一行(没有空白):
setDT(df)[,ct:=rleid(Pressure)][,if (.N>=5) .SD,by=ct]
发布于 2015-07-01 00:33:02
下面是一个使用基本R的解决方案:
df <- data.frame(id=1:10, Pressure=c(rep(1,5),6:10))
p.counts <- table(df[,"Pressure"])
good.pressures <- as.numeric(names(p.counts))[p.counts>=5]
df.sub <- df[df[,"Pressure"]%in%good.pressures,]
请注意,我使用df
作为示例数据集,因此您可以删除第一行代码,并将df
的所有实例替换为data.frame的名称。
https://stackoverflow.com/questions/31150390
复制相似问题