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

时间:2014-10-21 14:19:29

标签: r data.table dplyr

我一直在尝试使用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中都是相同的值,所以这个工作就会出现。在我看来,像这样的当前小组&#39;可能是一个有用的值,可以访问。 转换为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 个答案:

答案 0 :(得分: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]