假设我有data.frame
变量:
set.seed(1)
df <- data.frame(s=rnorm(100))
然后是另外两个与第一个变量单调的变量:
df$p <- pnorm(abs(df$s),lower.tail=F)
df$q <- p.adjust(df$p,method="BH")
我想为breaks
制作df$s
,并知道df$p
和df$a
的哪些值对应于breaks
。
所以,如果我这样做:
s.breaks <- hist(df$s,breaks=10,plot=F)$breaks
与df$p
对应的df$q
和s.breaks
的值是什么?
答案 0 :(得分:2)
您可以使用findInterval
获取直方图功能创建的类别。
df$cats <- findInterval(df$s, s.breaks)
这是直方图的结构
s.hist <- hist(df$s,breaks=10,plot=F)
str(s.hist)
List of 6
$ breaks : num [1:11] -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 ...
$ counts : int [1:10] 1 3 7 14 21 20 19 9 4 2
$ density : num [1:10] 0.02 0.06 0.14 0.28 0.42 0.4 0.38 0.18 0.08 0.04
$ mids : num [1:10] -2.25 -1.75 -1.25 -0.75 -0.25 0.25 0.75 1.25 1.75 2.25
$ xname : chr "df$s"
$ equidist: logi TRUE
- attr(*, "class")= chr "histogram"
请注意计数变量的元素。这与df $ cats上table
的输出相同。
table(df$cats)
1 2 3 4 5 6 7 8 9 10
1 3 7 14 21 20 19 9 4 2
如果目标是使用由df $ cats构建的类别来执行计算。然后你就完成了。例如,
tapply(df$p, df["cats"], mean)
将根据您的问题计算每个直方图栏中包含的观察值的df $ b的平均值。
如果目标是为相应类别单元格中具有相同计数数量的其他变量构建类别,则可以将rank
与cumsum
和findInterval
一起使用。
df$catp <- findInterval(rank(df$p), cumsum(c(1, s.hist$counts, 1)))
您可以使用table
检查细胞计数是否重新排列。
table(df$catp)
1 2 3 4 5 6 7 8 9 10
1 3 7 14 21 20 19 9 4 2