为什么group_by()会影响超出范围的数据帧?

时间:2017-08-29 15:25:01

标签: r dplyr

如果我将分组数据框传递给函数,则更改分组变量的名称,原始数据框的分组将更改为新名称。当函数返回时(我没有返回更改的数据框),原始数据框的名称保持不变,但分组更改为不存在的名称。

AllItems.Remove(something)

我可以理解为什么改变分组变量的名称可能是不好的做法,但这是允许的。这似乎是在通过值传递内容时通过引用传递的变量的属性的示例(正如我们理解R通常所做的那样)。

# test scoping of group_by() which appears to change groups
library(dplyr)

muck_up_group<-function(mydf){
  mydf<-mydf %>% rename(UhOh=Species)
}

dont_muck_up_group<-function(mydf){
  mydf<-mydf %>% ungroup()
  mydf<-mydf %>% rename(UhOh=Species)
}

data("iris")
iris<-as_tibble(iris) %>% group_by(Species)
iris
# A tibble: 150 x 5
# Groups:   Species [3]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
# 1          5.1         3.5          1.4         0.2  setosa

muck_up_group(iris) # original grouping changed to column name that doesn't exist
iris
# A tibble: 150 x 5
# Groups:   UhOh [3]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
# 1          5.1         3.5          1.4         0.2  setosa

#restore original state
iris<-as_tibble(iris) %>% group_by(Species)
dont_muck_up_group(iris) # original grouping preserved
iris
# A tibble: 150 x 5
# Groups:   Species [3]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
# 1          5.1         3.5          1.4         0.2  setosa

错误?感谢。

1 个答案:

答案 0 :(得分:1)

请参阅@ aosmith上面的评论。 Dplyr关闭了问题。