我一直在尝试使用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当前正在使用的特定组。
答案 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]