如何将Stata命令`by city, sort : egen float total_population = total(id)`转换为等价的R命令?
将Stata命令转换为等价的R实现
没问题!我来帮你把这条Stata命令转换成等价的R代码。先明确需求:我们需要按city字段分组,计算每组内唯一id的数量,再给每一行添加上这个统计值作为新变量total_population(从你的示例结果来看,原Stata命令实际是计算分组内不同id的个数,对应Stata的egen total_population = nvals(id),不过我们按你的预期输出实现)。
方法一:使用dplyr包(推荐,代码更直观易读)
dplyr是R中处理数据框的常用工具包,代码逻辑和Stata的分组操作很相似:
# 先加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) # 定义示例数据框 df <- data.frame( id = c(1,1,1,2,2,3,6,7,8,9,10), city = c("a","a","a","r","r","r","h","h","h","h","h") ) # 执行分组计算并生成新变量 df <- df %>% group_by(city) %>% # 按city字段分组 mutate(total_population = n_distinct(id)) %>% # 计算每组内唯一id的数量,生成新变量 ungroup() # 取消分组(避免后续操作受分组状态影响) # 查看结果 print(df)
方法二:使用基础R(无需额外安装包)
如果你不想加载第三方包,可以用基础R的ave()函数实现:
# 定义示例数据框 df <- data.frame( id = c(1,1,1,2,2,3,6,7,8,9,10), city = c("a","a","a","r","r","r","h","h","h","h","h") ) # 生成新变量 df$total_population <- ave(df$id, df$city, FUN = function(x) length(unique(x))) # 查看结果 print(df)
运行以上任意一种代码,都会得到你预期的输出结果:
id city total_population 1 1 a 1 2 1 a 1 3 1 a 1 4 2 r 2 5 2 r 2 6 3 r 2 7 6 h 5 8 7 h 5 9 8 h 5 10 9 h 5 11 10 h 5
内容的提问来源于stack exchange,提问作者Amc




