首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中格式化describeBy表?

如何在R中格式化describeBy表?
EN

Stack Overflow用户
提问于 2016-10-28 00:05:15
回答 2查看 5.7K关注 0票数 1

我有一个数据集:

代码语言:javascript
复制
Defects.I    Defects.D       Treatment
    1           2               A
    1           3               B

我正试图对检测到的缺陷和隔离的缺陷进行描述性统计,并按治疗分组。在搜索了一段时间之后,我在psych库中找到了一个名为describeBy()的好函数。使用以下代码:

代码语言:javascript
复制
describeBy(myData[1:2],myData$Treatment) 

我得到了这个输出:

代码语言:javascript
复制
Treatment A        
                  Mean.   Median.    Trimed.
    Defects.I       x        x          x
    Defects.D       x        x          x

Treatment B        
                  Mean.   Median.    Trimed.
    Defects.I       x        x          x
    Defects.D       x        x          x

但实际上我想找的是

代码语言:javascript
复制
                  Mean.   Median.    Trimed.
                  A  B     A  B       A  B
    Defects.I     x  x     x  x       x  x 
    Defects.D     x  x     x  x       x  x

数据

代码语言:javascript
复制
myData <- structure(list(Defects.I = c(1L, 1L), Defects.D = 2:3, Treatment = c("A", 
"B")), .Names = c("Defects.I", "Defects.D", "Treatment"), class = "data.frame", row.names = c(NA, 
-2L))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 00:53:50

因为describeBy返回数据帧的列表,所以我们可以将它们全部放在cbind上,但这并没有得到正确的顺序。相反,我们可以交错列。

代码语言:javascript
复制
myData <- structure(list(Defects.I = c(1L, 1L), Defects.D = 2:3,
                         Treatment = c("A", "B")),
                    .Names = c("Defects.I", "Defects.D", "Treatment"),
                    class = "data.frame", row.names = c(NA, -2L))

l <- psych::describeBy(myData[1:2], myData$Treatment)

所以交错使用这个命令

代码语言:javascript
复制
order(sequence(c(ncol(l$A), ncol(l$B))))
# [1]  1 14  2 15  3 16  4 17  5 18  6 19  7 20  8 21  9 22 10 23 11 24 12 25 13 26

而不是单靠cbind就能做到

代码语言:javascript
复制
c(1:13, 1:13)
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13  1  2  3  4  5  6  7  8  9 10 11 12 13

所以这就是

代码语言:javascript
复制
do.call('cbind', l)[, order(sequence(lengths(l)))]
#           A.vars B.vars A.n B.n A.mean B.mean A.sd B.sd A.median B.median A.trimmed B.trimmed A.mad B.mad
# Defects.I      1      1   1   1      1      1   NA   NA        1        1         1         1     0     0
# Defects.D      2      2   1   1      2      3   NA   NA        2        3         2         3     0     0
#           A.min B.min A.max B.max A.range B.range A.skew B.skew A.kurtosis B.kurtosis A.se B.se
# Defects.I     1     1     1     1       0       0     NA     NA         NA         NA   NA   NA
# Defects.D     2     3     2     3       0       0     NA     NA         NA         NA   NA   NA

或者作为一个函数

代码语言:javascript
复制
interleave <- function(l, how = c('cbind', 'rbind')) {
  how <- match.arg(how)
  if (how %in% 'rbind')
    do.call(how, l)[order(sequence(sapply(l, nrow))), ]
  else do.call(how, l)[, order(sequence(sapply(l, ncol))), ]
}

interleave(l)
#           A.vars B.vars A.n B.n
# Defects.I      1      1   1   1
# Defects.D      2      2   1   1 ...
# ...

interleave(l, 'r')
#             vars n mean sd median trimmed mad min max range skew kurtosis se
# A.Defects.I    1 1    1 NA      1       1   0   1   1     0   NA       NA NA
# B.Defects.I    1 1    1 NA      1       1   0   1   1     0   NA       NA NA
# A.Defects.D    2 1    2 NA      2       2   0   2   2     0   NA       NA NA
# B.Defects.D    2 1    3 NA      3       3   0   3   3     0   NA       NA NA
票数 2
EN

Stack Overflow用户

发布于 2016-10-28 00:14:05

您可以尝试mat = TRUE参数。这不完全是你想要的,但它更接近:

代码语言:javascript
复制
library(psych)
mydata = data.frame(Defects.I = c(1,1), Defects.D = c(2,3), Treatment = c('A','B'))

    describeBy(mydata[1:2], mydata$Treatment, mat = TRUE)

给出

代码语言:javascript
复制
           item group1 vars n mean sd median trimmed mad min max range skew kurtosis se
Defects.I1    1      A    1 1    1 NA      1       1   0   1   1     0   NA       NA NA
Defects.I2    2      B    1 1    1 NA      1       1   0   1   1     0   NA       NA NA
Defects.D1    3      A    2 1    2 NA      2       2   0   2   2     0   NA       NA NA
Defects.D2    4      B    2 1    3 NA      3       3   0   3   3     0   NA       NA NA
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40296046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档