【问题标题】:Long format in descriptive statistic table using dplyr使用 dplyr 的描述性统计表中的长格式
【发布时间】:2019-07-29 15:15:55
【问题描述】:

我正在尝试使用 dplyr 获取长格式的统计描述表。我确实尝试过收集,但它不起作用......我的代码示例:

data(mtcars)

table=mtcars %>% 
summarise_all(funs(mean, sd,median, min, max))
dim(table)

[1]  1 55

table[1:4,1:4]

>      mpg_mean cyl_mean disp_mean  hp_mean
1    20.09062   6.1875  230.7219 146.6875
NA         NA       NA        NA       NA
NA.1       NA       NA        NA       NA
NA.2       NA       NA        NA       NA

table2=mtcars %>% 
gather(stat) %>%
summarise_all(funs(mean, sd,median, min, max))
dim(table2)
table2[1:4,1:4]

1: In mean.default(stat) :
  argument is not numeric or logical: returning NA
2: In var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
  NAs introduced by coercion
3: In mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]) :
  argument is not numeric or logical: returning NA
> [1]  1 10
>      stat_mean value_mean stat_sd value_sd
1           NA   39.60853      NA 84.20792
NA          NA         NA      NA       NA
NA.1        NA         NA      NA       NA
NA.2        NA         NA      NA       NA

我认为每个统计数据都类似:

          mean    
mpg    20.09062   
cyl     6.1875    
disp    230.7219  
hp      146.6875  

编辑:

在这里,我添加了一个我的数据框的真实示例,删除了点和 _,我认为下面的解决方案更容易:

ex= data.frame(title_one=c(11, 22,34,22,43,454 ), title.two=c(22,44,343,3434,424,676), title3=c(6, 1 ,0 ,1 ,1 ,1 ))

names(ex) = gsub(pattern = "_*", replacement = "", x = names(ex)) 
names(ex) = gsub(pattern = ".", replacement = "", x = names(ex), fixed = TRUE)  

 table = ex %>%
   summarise_all(funs( min, max,mean, sd))

  gather(table) %>%
   separate(key, into = c("key1", 'key2')) %>%
   spread(key2, value)

  > + +       key1  max       mean min          sd
  1   title3    6   1.666667   0    2.160247
  2 titleone  454  97.666667  11  174.915599
  3 titletwo 3434 823.833333  22 1302.072873

【问题讨论】:

    标签: r dplyr statistics


    【解决方案1】:

    我们可以将gather 转换为“长”格式,separate 将“键”转换为两列,spread 将其转换为“宽”格式

    library(tidyverse)
    gather(table) %>%
        separate(key, into = c("key1", 'key2')) %>%
        spread(key2, value)
    

    对于有多个分隔符的更新数据集,我们可以使用extract 来捕获字符

    gather(table) %>%
        extract(key, into = c("key1", "key2"), "^(\\w+)[_.](.*)") %>% 
        spread(key2, value)
    

    【讨论】:

    • 谢谢,这个例子很好用,但遗憾的是我的真实数据出错了:错误:每行输出必须由唯一的键组合标识。密钥共享 35 行:
    • @Rodrigo。好的,遇到错误问题。最初,我通过添加gather(table) %>% separate(key, into = c("key1", 'key2")) %>% %>%group_by(key1, key2) %>% mutate(rn = row_number()) %>% spread(key2, value) 来解决这个问题,然后意识到,这里不需要,因为没有欺骗
    • 谢谢,变量很少,但我的整个数据集不行,变量名称出现在列中,统计名称出现在行中......
    • @Rodrigo。列名中有_,即多个_
    • using dataframe: "ex" from update 我有错误的列名,不存在更复杂的模式,但更改列名删除点和_您的解决方案效果很好!
    猜你喜欢
    • 2021-09-08
    • 2019-07-27
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多