You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:59:59