我有一个数据框,包含一个非唯一标识符(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=3
,B=2
,C=2
和D=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,超过某个门槛。
答案 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)
您可以像在问题中一样计算X
和thold
,然后在一步中完成此操作:
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值的频率。