具有阈值的数据框中的 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
因此,使用 colSums
比 apply()
版本快一点,但首先转换为矩阵会使速度提高一个数量级。
我的数据框如下所示:
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
因此,使用 colSums
比 apply()
版本快一点,但首先转换为矩阵会使速度提高一个数量级。