为什么从data.table输出生成的summary()不能打印到文件?

时间:2018-03-16 15:34:07

标签: r data.table

我在将摘要功能的输出打印到文件时出错。我有一个具有三个因子级别的列“bin”,并希望为每个级别返回5个数字摘要。五个数字摘要打印到屏幕但不会写入文件?我有错误报告

  

清空1:col 的data.table(0行)

数据:

       A       B          info          C bin
1:    10-60494 0.66392100 0.001833330   1 MAF0.01
2: rs148087467 0.35274000 0.000716240   1 MAF0.01
3: rs187110906 0.40586900 0.004488040   1 MAF0.01
4: rs192025213 0.00743299 0.000000000   1 MAF0.01
5: rs115033199 0.32829300 0.000614316   1 MAF0.01
6: rs183305313 0.51721200 0.002892520   1 MAF0.01

s <- df2[, print(summary(info)), by='bin']
print(s)
write.table(as.data.frame(s), 
quote=FALSE,file=paste(i,"sum_out.txt",sep=''))

输出继电器:

     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
0.0009998 0.0371300 0.2016000 0.2700000 0.4477000 1.0000000

2 个答案:

答案 0 :(得分:2)

您获得零行的原因是因为您在j中唯一要做的就是打印summary命令的结果。

考虑以下示例数据:

set.seed(2018)
dt <- data.table(bin = rep(c('A','B'), 5), val = rnorm(10,3,1))

现在你做的时候(就像你的问题一样):

s <- dt[, print(summary(val)), by = bin]

摘要统计信息将打印到控制台,但会导致空 data.table

> s <- dt[, print(summary(val)), by = bin]
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.389   2.577   2.936   3.547   4.735   5.099 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.450   2.735   3.271   2.991   3.637   3.863 
> s
Empty data.table (0 rows) of 1 col: bin

删除print - 命令无效:

> dt[, summary(val), by = bin]
    bin    V1
 1:   A 2.389
 2:   A 2.577
 3:   A 2.936
 4:   A 3.547
 5:   A 4.735
 6:   A 5.099
 7:   B 1.450
 8:   B 2.735
 9:   B 3.271
10:   B 2.991
11:   B 3.637
12:   B 3.863

因为summary返回一个表对象,该对象被data.table处理为向量。

不应使用print,而应使用as.listsummary的元素作为 data.table 中的列:

s <- dt[, as.list(summary(val)), by = bin]

现在,摘要统计信息包含在生成的 data.table

> s
   bin     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
1:   A 2.389413 2.577016 2.935571 3.547351 4.735284 5.099471
2:   B 1.450122 2.735289 3.270881 2.991340 3.637056 3.863351

由于摘要统计信息存储在非空 data.table s中,因此您可以将s写入文件,例如fwrite(快速写入函数data.table - 包)。

答案 1 :(得分:0)

这可以使用sapply()来实现 - 这是使用虹膜数据框的示例:

levels <- unique(iris$Species)
result <- data.frame(t(sapply(levels, function (x) summary(subset(iris, Species == levels[x])$Petal.Width))))

> result
  Min. X1st.Qu. Median  Mean X3rd.Qu. Max.
1  0.1      0.2    0.2 0.246      0.3  0.6
2  1.0      1.2    1.3 1.326      1.5  1.8
3  1.4      1.8    2.0 2.026      2.3  2.5