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