R-创建双条目数据透视表

R-创建双条目数据透视表,r,dataframe,dplyr,pivot,R,Dataframe,Dplyr,Pivot,我是一个新手,如果这是一个简单的问题,我很抱歉。 我使用很多excel创建“双条目”表。“dual table”这个名称可能不是最准确的,但我不知道如何用其他方式来描述它。 我基本上是从大表开始,然后创建一个新表,在这个表中,我通过两列平均数据分组,然后将其显示为矩阵。 我将与大家分享一个我自己编写的完美函数R示例。 我的问题是:有没有更简单/更好的方法? 这是我的工作代码: require(dplyr) df <- mtcars output_var <- 'disp' rows_

我是一个新手,如果这是一个简单的问题,我很抱歉。 我使用很多excel创建“双条目”表。“dual table”这个名称可能不是最准确的,但我不知道如何用其他方式来描述它。 我基本上是从大表开始,然后创建一个新表,在这个表中,我通过两列平均数据分组,然后将其显示为矩阵。 我将与大家分享一个我自己编写的完美函数R示例。 我的问题是:有没有更简单/更好的方法? 这是我的工作代码:

require(dplyr)
df <- mtcars
output_var <- 'disp'
rows_var <- 'cyl'
col_var <- 'am'
output_name <- paste0("Avg. ",output_var)
one_way_table <- df %>%
  group_by(eval(parse(text=rows_var)),     eval(parse(text=col_var))  ) %>%
  summarise(output=mean(    eval(parse(text=output_var))     ))  

one_way_table <- data.frame(one_way_table, check.rows = F, check.names = F, stringsAsFactors = F)
colnames(one_way_table) <- c(rows_var, col_var, output_name)

unique_row_items <- unique(one_way_table[,rows_var])
unique_col_items <- unique(one_way_table[,col_var])
x_rows <- rep(unique_row_items, length(unique_col_items))
y_cols <- rep(unique_col_items, length(unique_row_items))

new_df <- data.frame(x = x_rows, y = y_cols, check.rows = F, check.names = F, stringsAsFactors = F)
colnames(new_df) <- c(rows_var, col_var)

new_df <- base::merge(new_df, one_way_table, by = c(rows_var, col_var), all.x=T)
m <- matrix(new_df[, output_name],    ncol= length(unique(new_df[,col_var])) )
df_matrix <- data.frame(m, check.rows = F, check.names = F, stringsAsFactors = F)
require(dplyr)

df您的问题的可能解决方案可以来自
tidyverse
。下面是一个重塑数据并使用平均值进行聚合的示例:

library(tidyverse)
#Data
df <- mtcars
#Code
df %>% pivot_longer(cols = -c(cyl,am)) %>% filter(name=='disp') %>%
  group_by(cyl,am) %>% summarise(Mean=mean(value)) %>%
  pivot_wider(names_from = am,values_from=Mean)
库(tidyverse)
#资料
df%pivot_更长(cols=-c(cyl,am))%%>%filter(name=='disp')%%>%
分组依据(cyl,am)%>%总结(平均值=平均值))%>%
枢轴宽度(名称=am,值=平均值)
输出:

# A tibble: 3 x 3
# Groups:   cyl [3]
    cyl   `0`   `1`
  <dbl> <dbl> <dbl>
1     4  136.  93.6
2     6  205. 155  
3     8  358. 326 
#一个tible:3 x 3
#组别:共青团[3]
气缸'0``1`
1     4  136.  93.6
2     6  205. 155
3     8  358. 326

这接近于您的代码的最终输出。

如果我们需要旋转,可以用更简单的方法来完成。我们
选择感兴趣的列,并使用
pivot\u wide
values\u fn
指定为
mean
应用于从
values\u中选择的列

library(dplyr)
library(tidyr)
mtcars %>%
    select(cyl, am, disp) %>% 
    pivot_wider(names_from = am, values_from = disp, values_fn = mean)
# A tibble: 3 x 3
#    cyl   `1`   `0`
#  <dbl> <dbl> <dbl>
#1     6 155    205.
#2     4  93.6  136.
#3     8 326    358.
库(dplyr)
图书馆(tidyr)
mtcars%>%
选择(气缸、调幅、显示)%>%
枢轴宽度(名称=am,值=disp,值=平均值)
#一个tibble:3x3
#气缸'1``0`
#    
#1     6 155    205.
#2     4  93.6  136.
#3     8 326    358.