首页 文章

dplyr:查找分组中的子组标准

提问于
浏览
1

我一直在尝试使用dplry进行一些相当复杂的数据操作,并且遇到了这个我无法找到答案的问题 . 这是我在StackOverflow上提出的第一个问题 . 它可能更像是一个分组的data.table问题,而不是dplyr但是这里 .

data(iris)
df <- iris %>% group_by(Species) %>% 
  do((function(x) {
    print(names(x))
    print(class(x))
    if(x$Species[1] == 'setosa') x$Petal.Length <- x$Petal.Length+1
    return(x)
  })(.))

在这里,我仍然可以访问分组变量,因为数据保留为data.frame,do内的子组也是data.frame . 显然,整个x $ Species列在do中都是相同的值,所以这个工作就会出现 . 在我看来,“当前组”可能是一个有用的值,可以访问 . 转换为data.table时:

dt <- iris %>% tbl_dt() %>% 
  mutate(Species2 = Species) %>%
  group_by(Species) %>% 
  do((function(x) {
    print(names(x))
    print(class(x))
    print( attr(x, 'vars'))
    print(groups(x))
    if(x$Species2[1] == 'setosa') x$Petal.Length <-x$Petal.Length + 1
    return(x)
  })(.)) %>%

子组x是分组的data.table,分组变量从子组中删除 . 我已经包含了分组列的副本和来自do中的副本的引用,但我觉得应该/可能是一种更优雅的方式来引用do当前正在使用的特定组 .

1 回答

  • 2

    data.table 中,分组变量保持为原子值(不是向量),每个组的其余数据保存在 data.table 中,称为 .SD . 我正在尝试这样做,但这里有一些例子可能会让你前进:

    library(data.table)
    data(iris)
    setDT(iris)  # convert to data.table in place
    
    iris[, if (Species == 'setosa') {
             Petal.Length + 1
           } else {
             Petal.Length
           }
         , by = Species]
    
    # modify in place
    iris[Species == 'setosa', Petal.Length := Petal.Length + 1]
    
    # more complicated modification - modify the first Petal.Width by Species
    iris[iris[, .I[1], by = Species]$V1, Petal.Width := Petal.Width + 4]
    

相关问题