如何在R语言中基于其他数据框行数及统计组合频次创建新数据框?
让我来一步步帮你解决这两个R语言的问题:
问题1:基于另一数据框的行数创建新数据框
在R里,你可以通过nrow()函数获取目标数据框的行数,再以此为基础创建符合需求的新数据框,常见场景如下:
创建空的同行数数据框:如果只需要一个和原数据框行数一致、无列的空框,可这样写:
# 假设原数据框名为df new_df <- data.frame(matrix(nrow = nrow(df), ncol = 0))创建带序列列的新数据框:比如要添加一个从1开始的ID列,或者其他和行数匹配的序列列:
new_df <- data.frame( ID = 1:nrow(df), # 生成和原数据框行数一致的连续序列 stringsAsFactors = FALSE # 避免自动将字符转成因子(R4.0+版本默认已关闭该设置) )生成带重复/随机数据的新数据框:如果需要填充重复值或随机数据,结合
rep()或随机函数即可:# 生成和df行数相同,包含分类列与随机数值列的数据框 new_df <- data.frame( Category = rep("Group_A", nrow(df)), Value = rnorm(nrow(df)), # 生成正态分布随机数 stringsAsFactors = FALSE )
问题2:统计Number-Action组合的出现次数
针对你90万行的大数据量,推荐两种高效方法,都能生成包含Number、Action和Total(组合出现次数)的目标数据框:
方法1:用dplyr(语法直观,适合熟悉tidyverse的用户)
先加载dplyr包,再按Number和Action分组计数:
library(dplyr) # 分组统计,.groups = "drop"用于取消分组状态,避免后续操作受分组影响 df_summary <- df %>% group_by(Number, Action) %>% summarise(Total = n(), .groups = "drop")
用你提供的示例数据测试,输出结果如下:
Number Action Total 1 1 a 1 2 1 b 1 3 3 b 2 4 7 a 1
方法2:用data.table(速度更快,适合大数据量)
对于90万行的数据集,data.table的运算效率会比dplyr更高,用法如下:
library(data.table) # 将原数据框转换为data.table格式 dt <- as.data.table(df) # 按Number和Action分组,用.N统计每组的行数 dt_summary <- dt[, .(Total = .N), by = .(Number, Action)]
运行后得到的结果和上面完全一致,但处理大数据时会更流畅。
内容的提问来源于stack exchange,提问作者HL589
相关产品推荐
相关产品推荐

