r - 使用 tidyverse 重塑 data.frame 及其列名
问题描述
我data.frame
对每个样本的几个因素和测量值进行了一些实验。例如:
factors <- c("age","sex")
data.frame
看起来像这样:
library(dplyr)
set.seed(1)
df <- do.call(rbind,lapply(1:10,function(i) expand.grid(age=c("Y","O"),sex=c("F","M")) %>% dplyr::mutate(val=rnorm(4))))
grouped.mean.val.df <- df %>% dplyr::group_by_(.dots=factors) %>% dplyr::summarise(mean.val=mean(val))
我想创建一个data.frame
具有单行的列数是因子组合的数量(即nrow(expand.grid(age=c("Y","O"),sex=c("F","M"))
在本例中),其中的值是mean
df$val
的对应组合factors
。
为了获得mean
df$val
我所做的每种因素组合:
grouped.mean.val.df <- df %>% dplyr::group_by_(.dots=factors) %>% dplyr::summarise(mean.val=mean(val))
data.frame
我想得到的结果是:
res.df <- data.frame(Y.F=grouped.mean.val.df$mean.val[1],
Y.M=grouped.mean.val.df$mean.val[2],
O.F=grouped.mean.val.df$mean.val[3],
O.M=grouped.mean.val.df$mean.val[4])
有没有tidyverse
办法得到它?
解决方案
我们可以做unite
然后一个spread
. unite
'age' 和 'sex' 创建单个列,mutate
值factor
(以使顺序与预期的相同)并执行spread
'wide' 格式
library(tidyverse)
grouped.mean.val.df %>%
unite(agesex, age, sex, sep=".") %>%
mutate(agesex = factor(agesex, levels = unique(agesex))) %>%
spread(agesex, mean.val)
# A tibble: 1 x 4
# Y.F Y.M O.F O.M
# <dbl> <dbl> <dbl> <dbl>
#1 0.0695 0.411 -0.118 0.00577
group_by_
此外,我们可以使用group_by_at
将字符串作为变量来代替
df %>%
group_by_at(factors) %>%
summarise(mean.val = mean(val)) %>%
unite(agesex, age, sex, sep=".") %>%
mutate(agesex = factor(agesex, levels = unique(agesex))) %>%
spread(agesex, mean.val)
推荐阅读
- .net-core - 两个同名组件 - 定义优先级
- javascript - 如何隐藏类名动态变化的div元素?
- google-bigquery - 如何使用存储在 GCS 中的 CSV 文件创建 Google BigQuery 表,而无需文件头?
- python - 无法在pygame中的屏幕上呈现文本
- html - CSS不改变表单输入框
- angular - 我有一个 textarea 父组件我想使用 @input 更改子组件中 textarea 的高度
- mongodb - 如何将嵌套文档更新或插入到 mongdb 中的数组中
- javascript - 在 Node.js 的 typescript 中下载文件
- javascript - 为什么我的基于类的对象没有在事件处理程序中创建?
- java - 对字符串中的数值求和