Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用tidyr::与组员一起完成_R_Dplyr_Tidyr - Fatal编程技术网

使用tidyr::与组员一起完成

使用tidyr::与组员一起完成,r,dplyr,tidyr,R,Dplyr,Tidyr,有人知道tidyr::complete()是否支持通过groupby()分组吗 确切地说:我有一些数据框,看起来像这样 df <- data.frame( "ID" = rep(1:2, each = 2), "Col1" = c("A", NA, "AA", NA), "Col2" = c("B", "C", "BB", "CC")) 这会导致错误。然而,使用complete()而不分组是可行的,但这不是我想要的 df %>% complete(Col1, C

有人知道
tidyr::complete()
是否支持通过
groupby()分组吗

确切地说:我有一些数据框,看起来像这样

df <- data.frame(
  "ID"   = rep(1:2, each = 2),
  "Col1" = c("A", NA, "AA", NA),
  "Col2" = c("B", "C", "BB", "CC"))
这会导致错误。然而,使用
complete()
而不分组是可行的,但这不是我想要的

df %>% 
 complete(Col1, Col2)
问题:

  • 我是否做错了什么,或者
    complete()
    只是不与
    groupby
    一起工作
  • 如果是这样的话,我该怎么做呢(最好不使用循环)

  • 我们可以使用
    data.table
    来实现这一点。将“data.frame”转换为“data.table”(
    setDT(df)
    ),并交叉连接(
    CJ
    )按“ID”分组的“Col1”和“Col2”的
    unique
    元素

    library(data.table)#v1.9.6+
    setDT(df)[,CJ(Col1, Col2, unique=TRUE), by = ID]
    #   ID V1 V2
    #1:  1 NA  B
    #2:  1 NA  C
    #3:  1  A  B
    #4:  1  A  C
    #5:  2 NA BB
    #6:  2 NA CC
    #7:  2 AA BB
    #8:  2 AA CC
    

    您可以使用
    complete
    groupby
    进行操作,但必须使用
    do
    语句:

    df %>% 
     group_by(ID) %>% 
     do(complete(., Col1, Col2, fill = list(ID = .$ID)))
    

    只是想让大家知道,随着
    tidyr
    的开发版本(截至2016年1月13日的版本0.3.1.9000),所有
    tidyr
    动词现在都尊重分组,因此不再需要使用
    dplyr::do
    的解决方法。一旦CRAN上有了这个版本,我就会编辑我的答案。

    试试
    库(data.table);setDT(df)[,CJ(Col1,Col2,unique=TRUE),by=ID]
    df %>% 
     group_by(ID) %>% 
     do(complete(., Col1, Col2, fill = list(ID = .$ID)))