如何用dplyr和tidyverse按年份分析单词长度趋势并计算年均长度?
正确实现babynames数据集的名字长度分布与年度平均长度计算
1. 名字长度分布统计
示例代码的逻辑是正确的,它通过str_length(name)计算每个名字的字符长度,再用count()结合wt = n统计对应长度的总婴儿人数。为了让结果列名更清晰,建议加上name参数重命名统计列:
library(tidyverse) library(babynames) # 统计各名字长度对应的总婴儿数 name_length_dist <- babynames |> count(length = str_length(name), wt = n, name = "total_babies") print(name_length_dist)
2. 按年份分组计算平均名字长度
你的代码问题在于未考虑权重:直接对length取均值是把每个长度视为同等权重,但实际上每个长度对应的婴儿数量(n)才是权重,应该计算加权平均值——用每个长度乘以对应人数的总和,除以当年总婴儿数。
下面是两种正确实现方式:
方法一:分步计算(逻辑更直观)
先按年份和名字长度分组统计人数,再基于分组结果计算年度加权平均:
annual_avg_length <- babynames |> mutate(name_length = str_length(name)) |> group_by(year, name_length) |> summarise(group_total = sum(n), .groups = "drop_last") |> # 仅保留year分组 summarise( average_length = weighted.mean(name_length, w = group_total), yearly_total_babies = sum(group_total) # 可选:统计当年总婴儿数 ) print(annual_avg_length)
方法二:一步到位(代码更简洁)
直接按年份分组,用weighted.mean()一步计算加权平均:
annual_avg_length <- babynames |> mutate(name_length = str_length(name)) |> group_by(year) |> summarise( average_length = weighted.mean(name_length, w = n), yearly_total_babies = sum(n) ) print(annual_avg_length)
weighted.mean(name_length, w = n)会自动计算sum(name_length * n) / sum(n),这正是我们需要的年度平均名字长度。
内容的提问来源于stack exchange,提问作者kosk
相关产品推荐
相关产品推荐

