【问题标题】:dplyr repetition within %>% operator%>% 运算符中的 dplyr 重复
【发布时间】:2015-11-16 23:09:13
【问题描述】:

我正在尝试将repdplyr 一起使用,但我不完全理解为什么我不能让它工作。

我的数据如下所示。我想要的是通过n 对每个id 简单地重复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))

【问题讨论】:

标签: r dplyr repeat rep


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    要获得与cbind 相同的结果,我们可以使用do。正如@DavidArenburg 提到的,summarise 为每个组组合输出一个值/行,而使用mutate 我们得到具有相同行数的输出。但是,这里我们正在做一个不同的操作,可以在do 环境中完成。在代码中. 表示数据集。如果我们想从dt4 中提取'id' 列,我们可以使用dt4$iddt4[['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 的 cmets 的另一个选项是在我们需要保留的列中指定从 rep 生成的行索引 sliceselect

    dt4 %>%
         slice(rep(1:n(),n)) %>%
         select(-n)
    

    【讨论】:

    • 很有趣 - 你能解释一下do 的作用吗?以及如何在这里使用.$ 符号?谢谢阿克伦
    • group_by 在这种情况下做了什么? (抱歉,问题中的数据集似乎仍然损坏。)
    • @maj 在示例中,只有一个id,但我猜测在原始数据集中,可能有多个 id,我们希望在每个 id 组内进行复制步骤
    • do 在性能方面非常糟糕,这里不需要分组。我会去dt4 %&gt;% slice(rep(1:n(),n)) %&gt;% select(-n)
    • @Frank BTW,这是一个聪明的选择。我从来没有想过。我想知道你为什么不把它作为解决方案发布:-)
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2015-02-06
    • 2016-10-20
    • 2012-02-02
    • 2011-08-26
    • 2012-11-06
    • 2012-05-26
    • 2017-04-05
    相关资源
    最近更新 更多