dplyr 在 %>% 运算符内重复
dplyr repetition within %>% operator
我正在尝试将 rep
与 dplyr
一起使用,但我不完全理解为什么我不能让它工作。
我的数据是这样的。我想要的是对每个 id
简单地通过 n
重复 dayweek
。
head(dt4)
id dayweek n
1 1 Friday 3
2 1 Monday 3
3 1 Saturday 3
4 1 Sunday 3
5 1 Thursday 3
6 1 Tuesday 3
我想做的是在 dplyr
流程中
cbind(rep(dt4$id, dt4$n), rep(as.character(dt4$dayweek), dt4$n) )
这给出
[,1] [,2]
[1,] "1" "Friday"
[2,] "1" "Friday"
[3,] "1" "Friday"
[4,] "1" "Monday"
[5,] "1" "Monday"
[6,] "1" "Monday"
我不明白为什么这段代码不起作用
dt4 %>%
group_by(id) %>%
summarise(rep(dayweek, n))
Error: expecting a single value
有人可以帮我解决这个问题吗?
数据
dt4 = structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), dayweek = structure(c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L,
4L, 5L, 6L, 7L), .Label = c("Friday", "Monday", "Saturday", "Sunday",
"Thursday", "Tuesday", "Wedesnday"), class = "factor"), n = c(3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)), class = "data.frame", .Names = c("id",
"dayweek", "n"), row.names = c(NA, -21L))
要获得与 cbind
相同的结果,我们可以使用 do
。正如@DavidArenburg 提到的,summarise
每个组组合输出一个 value/row 而使用 mutate
我们得到具有相同行数的输出。但是,这里我们正在做一个不同的操作,可以在 do
环境中完成。在代码中 .
表示数据集。如果我们想从 dt4
中提取 'id' 列,我们可以使用 dt4$id
或 dt4[['id']]
。将 dt4
替换为 .
.
library(dplyr)
dt4 %>%
group_by(id) %>%
do(data.frame(id=.$id, v1=rep(.$dayweek, .$n)))
#Source: local data frame [63 x 2]
#Groups: id
# id v1
#1 1 Friday
#2 1 Friday
#3 1 Friday
#4 1 Monday
#5 1 Monday
#6 1 Monday
#7 1 Saturday
#8 1 Saturday
#9 1 Saturday
#10 1 Sunday
#.. .. ...
或者基于@Frank 的评论的另一种选择是在 slice
和 select
我们需要保留的列中指定从 rep
生成的行索引。
dt4 %>%
slice(rep(1:n(),n)) %>%
select(-n)
data.table 可能是此类操作的有用替代方案 - 我发现这更容易阅读:
library("data.table")
dt4 <- as.data.table(dt4)
head(dt4[, rep(dayweek, n), by=id], 10)
给予:
id V1
1: 1 Friday
2: 1 Friday
3: 1 Friday
4: 1 Monday
5: 1 Monday
6: 1 Monday
7: 1 Saturday
8: 1 Saturday
9: 1 Saturday
10: 1 Sunday
我正在尝试将 rep
与 dplyr
一起使用,但我不完全理解为什么我不能让它工作。
我的数据是这样的。我想要的是对每个 id
简单地通过 n
重复 dayweek
。
head(dt4)
id dayweek n
1 1 Friday 3
2 1 Monday 3
3 1 Saturday 3
4 1 Sunday 3
5 1 Thursday 3
6 1 Tuesday 3
我想做的是在 dplyr
流程中
cbind(rep(dt4$id, dt4$n), rep(as.character(dt4$dayweek), dt4$n) )
这给出
[,1] [,2]
[1,] "1" "Friday"
[2,] "1" "Friday"
[3,] "1" "Friday"
[4,] "1" "Monday"
[5,] "1" "Monday"
[6,] "1" "Monday"
我不明白为什么这段代码不起作用
dt4 %>%
group_by(id) %>%
summarise(rep(dayweek, n))
Error: expecting a single value
有人可以帮我解决这个问题吗?
数据
dt4 = structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), dayweek = structure(c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L,
4L, 5L, 6L, 7L), .Label = c("Friday", "Monday", "Saturday", "Sunday",
"Thursday", "Tuesday", "Wedesnday"), class = "factor"), n = c(3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)), class = "data.frame", .Names = c("id",
"dayweek", "n"), row.names = c(NA, -21L))
要获得与 cbind
相同的结果,我们可以使用 do
。正如@DavidArenburg 提到的,summarise
每个组组合输出一个 value/row 而使用 mutate
我们得到具有相同行数的输出。但是,这里我们正在做一个不同的操作,可以在 do
环境中完成。在代码中 .
表示数据集。如果我们想从 dt4
中提取 'id' 列,我们可以使用 dt4$id
或 dt4[['id']]
。将 dt4
替换为 .
.
library(dplyr)
dt4 %>%
group_by(id) %>%
do(data.frame(id=.$id, v1=rep(.$dayweek, .$n)))
#Source: local data frame [63 x 2]
#Groups: id
# id v1
#1 1 Friday
#2 1 Friday
#3 1 Friday
#4 1 Monday
#5 1 Monday
#6 1 Monday
#7 1 Saturday
#8 1 Saturday
#9 1 Saturday
#10 1 Sunday
#.. .. ...
或者基于@Frank 的评论的另一种选择是在 slice
和 select
我们需要保留的列中指定从 rep
生成的行索引。
dt4 %>%
slice(rep(1:n(),n)) %>%
select(-n)
data.table 可能是此类操作的有用替代方案 - 我发现这更容易阅读:
library("data.table")
dt4 <- as.data.table(dt4)
head(dt4[, rep(dayweek, n), by=id], 10)
给予:
id V1
1: 1 Friday
2: 1 Friday
3: 1 Friday
4: 1 Monday
5: 1 Monday
6: 1 Monday
7: 1 Saturday
8: 1 Saturday
9: 1 Saturday
10: 1 Sunday