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