包含两列的数据框的 dcast 问题

dcast issue on dataframe consisting two columns

我有一个包含两列的数据框,并尝试将其转换为两种宽格式,如下所示。但是,我无法找出仅包含一个数字列和一个非数字列的数据框。

library(tidyverse)
library(reshape2)

sample_frame<-data.frame(id=c("x","x","y","y","z","z"),value=c(1,2,3,4,5,6))

desired_output<-cbind(x=filter(sample_frame,id=="x")$value,
                       y=filter(sample_frame,id=="y")$value,
                      z=filter(sample_frame,id=="z")$value)
sample_frame
desired_output

desired_output<-dcast(sample_frame,id~.,value.var="value")
desired_output

> sample_frame
  id value
1  x     1
2  x     2
3  y     3
4  y     4
5  z     5
6  z     6
> desired_output
     x y z
[1,] 1 3 5
[2,] 2 4 6
> 
> desired_output<-dcast(sample_frame,id~.,value.var="value")
Aggregation function missing: defaulting to length
> desired_output
  id .
1  x 2
2  y 2
3  z 2

如上所示,使用 dcast 进行聚合。

在左侧使用 id 中的序列号。我们使用 1:2 因为每个 id 跨越两行。

dcast(1:2 ~ id, data = sample_frame)[-1]
##   x y z
## 1 1 3 5
## 2 2 4 6

如果您不知道每个 ID 跨越多少行,或者这些行不相邻,或者如果不是所有 ID 都跨越相同的行数,请使用它来生成左侧。

s <- with(sample_frame, ave(value, id, FUN = seq_along))
dcast(s ~ id, data = sample_frame)[-1]

如果使用 data.table 没问题,请参阅下面的评论以了解 s 的替代方法。

基础解决方案

仅使用基数 R 的解决方案如下,其中 s 来自上方。

xtabs(value ~ s + id, sample_frame)

给出以下 xtabs 对象:

   id
s   x y z
  1 1 3 5
  2 2 4 6

tidyverse 中,您可以为每个 id 创建一个唯一的行号,并以宽格式获取数据。

library(dplyr)

sample_frame %>%
   group_by(id) %>%
   mutate(row = row_number()) %>%
   tidyr::pivot_wider(names_from = id, values_from = value) %>%
   select(-row)

# A tibble: 2 x 3
#      x     y     z
#   <dbl> <dbl> <dbl>
#1     1     3     5
#2     2     4     6