防止 dcast 聚合数据
Prevent dcast from aggregating data
我有这样的数据:
rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon
而且我想像
一样dcast
dcast(data, rating ~ title, value.var="rating")
所以标题变成了 headers 列,下面列出了每个标题的评分。但是,每次它都会聚合它们,但我不想要这个。
read.table(text="rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon", header=TRUE, stringsAsFactors=FALSE) %>%
dplyr::mutate(id = 1:n()) %>%
tidyr::spread(title, rating, fill = 0) %>%
dplyr::select(-id)
## Bacon Bean Egg
## 1 0 5 0
## 2 0 5 0
## 3 0 4 0
## 4 0 5 0
## 5 0 0 5
## 6 0 0 4
## 7 3 0 0
## 8 2 0 0
可以用 dplyr
& tidyverse
包来完成 :
library(dplyr)
library(tidyverse)
data<-data.frame(rating=c(5,5,4,5,5,4,3,2),
title=c("Bean","Bean","Bean","Bean","Egg","Egg","Bacon","Bacon"))
代码:
data%>%mutate(dummy = 1:nrow(data)) %>%
spread(title, rating, fill = 0) %>%
select(-dummy)%>%t()
输出:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
Bacon 0 0 0 0 0 0 3 2
Bean 5 5 4 5 0 0 0 0
Egg 0 0 0 0 5 4 0 0
如果您对 dcast
的使用有意义,我将提供使用 data.table
的替代方法。与其他答案略有不同,我想知道你是否打算将此用于 演示 副实际摘要,因为不同评级之间没有明显的上下文相关性。
library(data.table)
DT <- fread('rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon')
首先我们需要分配一些 "id" 保存在枢轴中。同样,由于这是为了演示(我们可能希望在未使用的空间副 0
或 NA
中留有空白),我将转换
DT$rating <- as.character(DT$rating)
DT[, id := seq_len(.N), by="title"]
DT
# rating title id
# 1: 5 Bean 1
# 2: 5 Bean 2
# 3: 4 Bean 3
# 4: 5 Bean 4
# 5: 5 Egg 1
# 6: 4 Egg 2
# 7: 3 Bacon 1
# 8: 2 Bacon 2
dcast(DT, id ~ title, value.var = "rating", fill = "")[,id := NULL,][]
# Bacon Bean Egg
# 1: 3 5 5
# 2: 2 5 4
# 3: 4
# 4: 5
请注意,这不是为了计算和分析,只是为了展示。如果你想保留所有数字,那么你最终会得到
# starting with fresh `DT`, no as.character done
DT[, id := seq_len(.N), by="title"]
dcast(DT, id ~ title, value.var = "rating")[,id := NULL,][]
# Bacon Bean Egg
# 1: 3 5 5
# 2: 2 5 4
# 3: NA 4 NA
# 4: NA 5 NA
或者可以选择使用 dcast(..., fill=0)
将 NA
替换为 0
。
(在这种情况下,任何单个行上的三个值如何相互关联仍然不是很清楚,但也许在您的真实 data/analysis 中有意义。)
我有这样的数据:
rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon
而且我想像
一样dcastdcast(data, rating ~ title, value.var="rating")
所以标题变成了 headers 列,下面列出了每个标题的评分。但是,每次它都会聚合它们,但我不想要这个。
read.table(text="rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon", header=TRUE, stringsAsFactors=FALSE) %>%
dplyr::mutate(id = 1:n()) %>%
tidyr::spread(title, rating, fill = 0) %>%
dplyr::select(-id)
## Bacon Bean Egg
## 1 0 5 0
## 2 0 5 0
## 3 0 4 0
## 4 0 5 0
## 5 0 0 5
## 6 0 0 4
## 7 3 0 0
## 8 2 0 0
可以用 dplyr
& tidyverse
包来完成 :
library(dplyr)
library(tidyverse)
data<-data.frame(rating=c(5,5,4,5,5,4,3,2),
title=c("Bean","Bean","Bean","Bean","Egg","Egg","Bacon","Bacon"))
代码:
data%>%mutate(dummy = 1:nrow(data)) %>%
spread(title, rating, fill = 0) %>%
select(-dummy)%>%t()
输出:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
Bacon 0 0 0 0 0 0 3 2
Bean 5 5 4 5 0 0 0 0
Egg 0 0 0 0 5 4 0 0
如果您对 dcast
的使用有意义,我将提供使用 data.table
的替代方法。与其他答案略有不同,我想知道你是否打算将此用于 演示 副实际摘要,因为不同评级之间没有明显的上下文相关性。
library(data.table)
DT <- fread('rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon')
首先我们需要分配一些 "id" 保存在枢轴中。同样,由于这是为了演示(我们可能希望在未使用的空间副 0
或 NA
中留有空白),我将转换
DT$rating <- as.character(DT$rating)
DT[, id := seq_len(.N), by="title"]
DT
# rating title id
# 1: 5 Bean 1
# 2: 5 Bean 2
# 3: 4 Bean 3
# 4: 5 Bean 4
# 5: 5 Egg 1
# 6: 4 Egg 2
# 7: 3 Bacon 1
# 8: 2 Bacon 2
dcast(DT, id ~ title, value.var = "rating", fill = "")[,id := NULL,][]
# Bacon Bean Egg
# 1: 3 5 5
# 2: 2 5 4
# 3: 4
# 4: 5
请注意,这不是为了计算和分析,只是为了展示。如果你想保留所有数字,那么你最终会得到
# starting with fresh `DT`, no as.character done
DT[, id := seq_len(.N), by="title"]
dcast(DT, id ~ title, value.var = "rating")[,id := NULL,][]
# Bacon Bean Egg
# 1: 3 5 5
# 2: 2 5 4
# 3: NA 4 NA
# 4: NA 5 NA
或者可以选择使用 dcast(..., fill=0)
将 NA
替换为 0
。
(在这种情况下,任何单个行上的三个值如何相互关联仍然不是很清楚,但也许在您的真实 data/analysis 中有意义。)