首页 > 解决方案 > 是否可以从 dplyr 管道调用 dcast 函数?

问题描述

是否可以在 dplyr 管道中使用 dcast 功能?我应该如何定义 dcast 的第一个参数?如何首先使用 dplyr 过滤数据,然后使用 reshape2 将其转换为宽格式?

set.seed(45)
df <- data.frame(
    name = rep(c("firstName", "secondName"), each=4),
    numbers = rep(1:4, 2),
    value = rnorm(8)
    )

我想做这个:

library(dplyr)
library(reshape2)

df <- df %>% 
  filter(numbers<>4) %>% 
  dcast(...)

是否可以在 dplyr 转换中使用 dcast?如果是这样,这里的第一个论点是什么?

标签: rdplyrreshapereshape2

解决方案


in的data参数dcast并不是真正需要的,%>%因为它隐含地假设数据是从上一步传递过来的任何数据。我们可以指定formula'value.var' 列

library(dplyr)   
df %>% 
    filter(numbers != 4) %>%
    reshape2::dcast(name ~ numbers, value.var = 'value')
#      name          1          2          3
#1  firstName  0.3407997 -0.7033403 -0.3795377
#2 secondName -0.8981073 -0.3347941 -0.5013782

如果我们需要指定data

df %>% 
    filter(numbers != 4) %>%
    reshape2::dcast(., name ~ numbers, value.var = 'value')

使用tidyverse,有pivot_wider(从- 成功 reshape2 函数)执行与(以及更多)tidyr类似的整形并返回reshape2::dcasttibble

library(tidyr)
df %>% 
    filter(numbers != 4) %>% 
    pivot_wider(names_from = numbers, values_from = value)
# A tibble: 2 x 4
#  name          `1`    `2`    `3`
#  <chr>       <dbl>  <dbl>  <dbl>
#1 firstName   0.341 -0.703 -0.380
#2 secondName -0.898 -0.335 -0.501

推荐阅读