R 数字总和在数据帧中起作用,但在TIBLE中不起作用

R 数字总和在数据帧中起作用,但在TIBLE中不起作用,r,dataframe,sum,tibble,R,Dataframe,Sum,Tibble,我想把一列TIBLE中的所有数字相加,作为学习R的练习,并使用示例数据集forcats::gss_cat。我想按年龄看一下婚姻状况: by_ag <- gss_cat %>% filter(!is.na(age)) %>% group_by(age, marital) %>% count() by_age <- by_ag %>% mutate(prop = n/sum(n)) ggplot(by_age, aes(age, prop, colour =

我想把一列TIBLE中的所有数字相加,作为学习R的练习,并使用示例数据集
forcats::gss_cat
。我想按年龄看一下婚姻状况:

by_ag <- gss_cat %>%
filter(!is.na(age)) %>%
group_by(age, marital) %>%
count() 
by_age <- by_ag %>%
mutate(prop = n/sum(n))

ggplot(by_age, aes(age, prop, colour = marital)) +
  geom_line(na.rm = TRUE)
并计算了一个比例:

df %>%
  mutate(prop = number/sum(number))
这与预期的效果一样:

# A tibble: 3 x 3
type       number  prop
<chr>       <dbl> <dbl>
1 new          20.0 0.303
2 old          12.0 0.182
3 don't know   34.0 0.515
#一个tible:3 x 3
型号道具
1新的20.0 0.303
2旧的12.0 0.182
3不知道34.0 0.515
因此,我将初始TIBLE转换为数据帧并重新运行代码:

by_age <- as.data.frame(by_ag) %>%
  mutate(prop = n/sum(n))
ggplot(by_age, aes(age, prop, colour = marital)) +
  geom_line(na.rm = TRUE)
按年龄划分%
变异(prop=n/和(n))
ggplot(按年龄、aes(年龄、道具、颜色=婚姻))+
几何线(na.rm=真)
有一个完美的情节:

因此,我的初步结论是,原因是我原来有一个tibble。因此,为了验证这一假设,我还创建了一个新的tibble:

df <- tibble(type = c("new", "old", "don't know"), number = c(20, 12, 34))
df %>%
  mutate(prop = number/sum(number))
df%
变异(属性=数量/总和(数量))
然后完全弄糊涂了,在这里,计算比例没有问题:

A tibble: 3 x 3
type       number  prop
<chr>       <dbl> <dbl>
1 new          20.0 0.303
2 old          12.0 0.182
3 don't know   34.0 0.515
A tible:3 x 3
型号道具
1新的20.0 0.303
2旧的12.0 0.182
3不知道34.0 0.515
那么为什么在我的初始示例中,
sum(n)
不起作用呢

我想补充一点,这来自R for Data Science()的一个练习,它们不会取消分组:
那么这可能是什么原因呢?

这里的“by_ag”是一个分组对象,因此,“n”的
和是在每个“组”内进行和。选项是提取列,即
$n

by_ag %>%
    mutate(prop = n/sum(.$n))
或者
取消对象分组
然后执行
求和

by_ag %>%
    ungroup %>%
    mutate(prop = n/sum(n))

为了说明差异,请使用OP的“df”

df %>%
    group_by(type) %>%
    mutate(Sum = sum(number))
# A tibble: 3 x 3
# Groups: type [3]
#  type       number   Sum
#  <fctr>      <dbl> <dbl>
#1 new          20.0  20.0
#2 old          12.0  12.0
#3 don't know   34.0  34.0

df %>% 
    group_by(type) %>%
    mutate(Sum = sum(.$number))
# A tibble: 3 x 3
# Groups: type [3]
#  type       number   Sum
#  <fctr>      <dbl> <dbl>
#1 new          20.0  66.0
#2 old          12.0  66.0
#3 don't know   34.0  66.0
我们添加了两个分组变量,而不是一个分组变量

by_ag <- gss_cat %>%
            filter(!is.na(age)) %>%
            group_by(age, marital) %>%
            count()    

str(by_ag) #check the grouped_df class
#Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 351 obs. of  3 variables:
# $ age    : int  18 18 19 19 19 19 20 20 20 20 ...
# $ marital: Factor w/ 6 levels "No answer","Never married",..: 2 6 2 4 5 6 2 3 4 6 ...
# $ n      : int  89 2 234 3 1 11 227 1 2 21 ...
# - attr(*, "vars")= chr  "age" "marital"
# - attr(*, "drop")= logi TRUE
# - attr(*, "indices")=List of 351
类似于
ungroup

by_ag %>% 
     ungroup %>% 
     str
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       351 obs. of  3 variables:
# $ age    : int  18 18 19 19 19 19 20 20 20 20 ...
# $ marital: Factor w/ 6 levels "No answer","Never married",..: 2 6 2 4 5 6 2 3 4 6 ...
# $ n      : int  89 2 234 3 1 11 227 1 2 21 ...

您可能需要
ungroup
,因为
by_ag
是一个分组对象,这实际上是有效的。但是你能解释一下为什么这一步是必要的吗?我假设计算会产生一个名为“n”的新列的TIBLE,并且取这些值的总和不应取决于分组?因为您仍然在每个组中进行
总和
,而不是整个列“n”。请以您的示例检查
df
df%>%groupby(type)%%>%mutate(Sum=Sum(number))
我非常感谢,并将尝试了解更多内容以完全理解。谢谢,我会记住这一点。
by_ag <- gss_cat %>%
            filter(!is.na(age)) %>%
            group_by(age, marital) %>%
            count()    

str(by_ag) #check the grouped_df class
#Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 351 obs. of  3 variables:
# $ age    : int  18 18 19 19 19 19 20 20 20 20 ...
# $ marital: Factor w/ 6 levels "No answer","Never married",..: 2 6 2 4 5 6 2 3 4 6 ...
# $ n      : int  89 2 234 3 1 11 227 1 2 21 ...
# - attr(*, "vars")= chr  "age" "marital"
# - attr(*, "drop")= logi TRUE
# - attr(*, "indices")=List of 351
as.data.frame(by_ag) %>% 
           str
#'data.frame':   351 obs. of  3 variables:
#$ age    : int  18 18 19 19 19 19 20 20 20 20 ...
#$ marital: Factor w/ 6 levels "No answer","Never married",..: 2 6 2 4 5 6 2 3 4 6 ...
#$ n      : int  89 2 234 3 1 11 227 1 2 21 ...
by_ag %>% 
     ungroup %>% 
     str
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       351 obs. of  3 variables:
# $ age    : int  18 18 19 19 19 19 20 20 20 20 ...
# $ marital: Factor w/ 6 levels "No answer","Never married",..: 2 6 2 4 5 6 2 3 4 6 ...
# $ n      : int  89 2 234 3 1 11 227 1 2 21 ...