我正在从文件中读取稀疏表格,如下所示:
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列中的值表示在此模拟中观察到的值i-1的次数。例如,在第一个模拟(第一行)中,我们得到一个值为'0'的结果(第一列),7个值为'2'的结果(第三列)等。
我希望为所有模拟结果创建一个平均累积分布函数(CDF),因此我稍后可以使用它来计算真实结果的经验p值。
要做到这一点,我可以先对每一列进行总结,但我需要为undef列取零。
如何读取具有不同行长度的表格?如何总结用'0'代替'undef'值的列?最后,我如何创建CDF? (我可以手动完成,但我想有一些包可以做到这一点。)
答案 0 :(得分:4)
这将读取以下数据:
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)
答案 1 :(得分:2)
您可以使用ecdf()
(在基础R中)或Ecdf()
(来自Hmisc包)功能。