题
我正在从一个看起来像以下内容的文件中读取一张稀疏的表:
1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1
注意行长不同。
每行代表一个单个模拟。每行的第i-th列中的值表明在此模拟中观察到了多少次值I-1。例如,在第一个模拟(第一行)中,我们获得了一个带有值'0'(第一列)的结果,7个带有值'2'(第三列)等的结果。
我希望为所有仿真结果创建平均累积分布函数(CDF),以便以后可以使用它来计算经验P值以实现真实结果。
为此,我可以首先总结每一列,但是我需要对Undef列进行零。
如何阅读具有不同行长的表格?如何总结列替换为0'的“ undef”值的列?最后,如何创建CDF? (我可以手动执行此操作,但我想有一些软件包可以做到这一点)。
解决方案
这将读取数据:
dat <- textConnection("1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1")
df <- data.frame(scan(dat, fill = TRUE, what = as.list(rep(1, 29))))
names(df) <- paste("Val", 1:29)
close(dat)
导致:
> head(df)
Val 1 Val 2 Val 3 Val 4 Val 5 Val 6 Val 7 Val 8 Val 9 Val 10 Val 11 Val 12
1 1 0 7 0 0 1 0 0 0 5 0 0
2 1 0 0 1 0 0 0 3 0 0 0 0
3 0 0 0 1 0 0 0 2 0 0 0 0
4 1 0 0 1 0 3 0 0 0 0 1 0
5 0 0 0 1 0 0 0 2 0 0 0 0
....
如果数据在文件中,请提供文件名而不是 dat
. 。根据您提供的数据,该代码假定最多有29列。改变 29
适合真实数据。
我们使用列总和
df.csum <- colSums(df, na.rm = TRUE)
这 ecdf()
函数生成您想要的ECDF,
df.ecdf <- ecdf(df.csum)
我们可以使用 plot()
方法:
plot(df.ecdf, verticals = TRUE)
其他提示
您可以使用 ecdf()
(在基础r)或 Ecdf()
(来自 HMISC 包)功能。
不隶属于 StackOverflow