【问题标题】:Another way to do pivot table in R在 R 中做数据透视表的另一种方法
【发布时间】:2017-02-01 01:43:45
【问题描述】:

我有如下数据集:

> head(worldcup)
               Team   Position Time Shots Passes Tackles Saves
Abdoun      Algeria Midfielder   16     0      6       0     0
Abe           Japan Midfielder  351     0    101      14     0
Abidal       France   Defender  180     0     91       6     0
Abou Diaby   France Midfielder  270     1    111       5     0
Aboubakar  Cameroon    Forward   46     2     16       0     0
Abreu       Uruguay    Forward   72     0     15       0     0

然后是某些变量的码数均值:

wc_3 <- worldcup %>% 
  select(Time, Passes, Tackles, Saves) %>%
  summarize(Time = mean(Time),
            Passes = mean(Passes),
            Tackles = mean(Tackles),
            Saves = mean(Saves))

输出是:

> wc_3
      Time   Passes  Tackles     Saves
1 208.8639 84.52101 4.191597 0.6672269

然后我需要执行如下输出:

      var           mean
     Time    208.8638655
   Passes     84.5210084
  Tackles      4.1915966
    Saves      0.6672269

我试着这样做:

wc_3 <- worldcup %>% 
  select(Time, Passes, Tackles, Saves) %>%
  summarize(Time = mean(Time),
            Passes = mean(Passes),
            Tackles = mean(Tackles),
            Saves = mean(Saves)) %>%
  gather(var, mean, Time:Saves, factor_key=TRUE)

输出是一样的。我的问题:有没有用不同的方式执行相同的输出?

这是我的课程,但我的提交被拒绝了。我不知道为什么,但我曾经问过这个。

请指教

【问题讨论】:

  • 嗯,小标题的转置函数可能很好(有吗?),比如wc_3 %&gt;% t %&gt;% as.data.frame %&gt;% tibble::rownames_to_column() %&gt;% setNames(c("var", "mean"))

标签: r dplyr tidyr


【解决方案1】:

一个选项是先到gather,然后按“Var”和summarise分组以获得“Val”的mean

library(dplyr)
library(tidyr)
worldcup %>% 
       gather(Var, Val, Time:Saves) %>% 
       filter(Var!= "Shots") %>%
       group_by(Var) %>% 
       summarise(Mean = mean(Val))

【讨论】:

  • 你为什么要过滤Var != "Saves"
  • @AbeNeuwirth 感谢您的评论。我实际上是想删除Shots,因为它不在预期的输出中
【解决方案2】:

另一种选择是转置您的输出 wc_3,如下所示:

result &lt;- as.data.frame(t(w_c))

设置“平均”变量的名称:

names(result)[1] &lt;- "mean"

来自 wc_3 的列的名称已经成为 'result' 中的行名,因此我们需要将这些作为列“var”的值:

result$var &lt;- rownames(result)

将“结果”表中的行名设置为 NULL:

rownames(result) &lt;- NULL

交换列的顺序:

result &lt;- result[,c(2,1)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多