具有阈值的数据框中的 R 正态分布

R normal distirbution in data frame with threshold

我的数据框如下所示:

    match 1   match 2   match 3   match 4   ....
    0.98      1.23      2.31      0.41
    0.75      0.31      0.99      1.21
    2.10      0.65      1.43      1.17
    1.11      1.87      0.24      1.98
...

我有 10,000 列和 ~4000 行。我想知道每列中有多少分数高于 2.05。例如,第 1 列中有 1,第 3 列中有 1。然后我想使用这些数字并进行 histogram/normal 分布。有人有什么想法吗?

这是您可以执行的操作的示例:

df<-data.frame(x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))

nc1<-apply(df,2,function(x)sum(x>1))

hist(nc1)

在之前的答案的基础上,改为使用 length 来计算每列中大于 2.05 的 obs 的数量,然后使用 barplot 按列显示数量。

      df<- data.frame(matrix(rnorm(10000)+1,ncol=100,nrow=100))

      nc1<-apply(df,2,function(x) length(which(x>2.05)))

      a = table(nc1)

      barplot(a,ylab="Frequency",xlab="Number of Obs Greater than 2.05")

我相信这就是您要找的情节。

只是想添加一些简化和基准测试。由于您拥有大量数据,因此速度可能是一个问题。 apply() 方法可以简化以提高速度。

由于您的数据似乎都是数字,因此使用矩阵比 data.frame.

很多
df = data.frame(x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
mat = as.matrix(df)

f1 = function(df) apply(df,2,function(x)length(which(x>1)))
f2 = function(df) apply(df,2,function(x)sum(x>1))
f3 = function(df) colSums(df > 1)

mbm = microbenchmark::microbenchmark

mbm(f1(df), f2(df), f3(df), f3(mat))
# Unit: microseconds
#     expr    min      lq      mean  median       uq     max neval cld
#   f1(df) 91.460 95.3835 105.86092 98.7045 109.4195 309.392   100   c
#   f2(df) 86.026 92.3655 102.25993 96.8930 107.6085 160.281   100   c
#   f3(df) 60.369 64.1430  71.49276 66.4070  76.9715 114.702   100  b 
#  f3(mat)  7.848  9.0560  11.20236  9.9615  10.5660  51.616   100 a  

identical(f1(df), f2(df), f3(df), f3(mat))
# [1] TRUE

因此,使用 colSumsapply() 版本快一点,但首先转换为矩阵会使速度提高一个数量级。