在不删除值的情况下对数据帧进行阈值处理

时间:2015-04-02 06:44:49

标签: r dataframe scatter-plot

我有一个数据框,包含一个非唯一标识符(ID)和该ID中对象的某些属性的度量,如下所示:

ID   Sph
 A   1.0 
 A   1.2
 A   1.1     
 B   0.5     
 B   1.8    
 C   2.2    
 C   1.1    
 D   2.1    
 D   3.0

首先,我使用table(df$ID)将每个ID的实例数量设为X,即A=3B=2C=2D=2。接下来,我想在获取实例数后在“Sph”类别中应用阈值,限制为Sph值超过阈值的行。例如,使用阈值2.0,我会使用thold=df[df$Sph>2.0,]。最后,我想将ID列替换为我使用上面X计算的table值。例如,在“Sph”列中阈值为1.1,我想要以下输出:

ID   Sph    
 3   1.0    
 2   1.8    
 2   2.2    
 2   2.1    
 2   3.0

换句话说,在使用table()获取与ID发生次数相对应的x值(比如3)后,我想将该数字分配给该ID中的每个值Y,超过某个门槛。

2 个答案:

答案 0 :(得分:0)

您的问题中存在一些不一致之处,并且您没有提供可重复的示例,但这是我的尝试。

我喜欢使用dplyr库,在这种情况下,我必须打破一个sapply,也许有人可以改进我的答案。

这是简短版本:

library(dplyr)
#your data
x <- data.frame(ID=c(rep("A",3),rep("B",2),rep("C",2),rep("D",2)),Sph=c(1.0,1.2,1.1,0.5,1.8,2.2,1.1,2.1,3.0),stringsAsFactors = FALSE)

#lookup table
y <- summarise(group_by(x,ID), IDn=n())

#fill in original table
x$IDn <- sapply(x$ID,function(z) as.integer(y[y$ID==z,"IDn"]))

#filter for rows where Sph greater or equal to 1.1
x <- x %>% filter(Sph>=1.1)

#done
x

这是带有解释性输出的较长版本:

> library(dplyr)
> #your data
> x <- data.frame(ID=c(rep("A",3),rep("B",2),rep("C",2),rep("D",2)),Sph=c(1.0,1.2,1.1,0.5,1.8,2.2,1.1,2.1,3.0),stringsAsFactors = FALSE)
> x
  ID Sph
1  A 1.0
2  A 1.2
3  A 1.1
4  B 0.5
5  B 1.8
6  C 2.2
7  C 1.1
8  D 2.1
9  D 3.0
> 
> #lookup table
> y <- summarise(group_by(x,ID), IDn=n())
> y
Source: local data frame [4 x 2]

  ID IDn
1  A   3
2  B   2
3  C   2
4  D   2
> 
> #fill in original table
> x$IDn <- sapply(x$ID,function(z) as.integer(y[y$ID==z,"IDn"]))
> x
  ID Sph IDn
1  A 1.0   3
2  A 1.2   3
3  A 1.1   3
4  B 0.5   2
5  B 1.8   2
6  C 2.2   2
7  C 1.1   2
8  D 2.1   2
9  D 3.0   2
> 
> #filter for rows where Sph greater or equal to 1.1
> x <- x %>% filter(Sph>=1.1)
> 
> #done
> x
  ID Sph IDn
1  A 1.2   3
2  A 1.1   3
3  B 1.8   2
4  C 2.2   2
5  C 1.1   2
6  D 2.1   2
7  D 3.0   2

答案 1 :(得分:0)

您可以像在问题中一样计算Xthold,然后在一步中完成此操作:

X <- table(df$ID)
thold <- df[df$Sph > 1.1,]
thold$ID <- X[as.character(thold$ID)]
thold
#   ID Sph
# 2  3 1.2
# 5  2 1.8
# 6  2 2.2
# 8  2 2.1
# 9  2 3.0

基本上,您会在您构建的表X中查找每个ID值的频率。