如何将R语言数据框中的事件转换为频数分布?附示例
把R语言数据框转换为球员事件频数分布
嘿,我来帮你搞定这个数据转换问题——把长格式的球员事件数据转换成按球员统计各事件频数的宽格式数据框。这里有两种实用的方法,你可以根据自己的习惯选择:
先确认示例数据
首先我们先把示例数据定义好,方便后续测试:
testData <- data.frame( player = c(1,2,1,2,2,3,3,2,3,1), event = c(rep("shot",3),rep("pass",5),rep("score",2)) )
方法1:使用tidyverse工具集(推荐)
如果你习惯用tidyverse的语法,这个方法逻辑清晰,代码可读性强:
library(tidyverse) # 统计频数并转换为宽格式 desiredResult <- testData %>% # 先统计每个球员的各事件发生次数 count(player, event) %>% # 把长格式转成宽格式,缺失的事件填充0 pivot_wider( names_from = event, values_from = n, values_fill = 0 ) %>% # 把列名改成题目要求的复数形式 rename( shots = shot, passes = pass, scores = score ) # 查看结果 desiredResult
运行后会得到你想要的结果:
# A tibble: 3 × 4 player shots passes scores <dbl> <int> <int> <int> 1 1 2 0 1 2 2 1 3 0 3 3 0 2 1
方法2:基础R实现
如果不想加载额外包,用基础R也能完成:
# 生成球员-事件的交叉频数表 freq_table <- xtabs(~ player + event, data = testData) # 转换为数据框并整理格式 desiredResult_base <- as.data.frame.matrix(freq_table) # 把行名转为player列 desiredResult_base$player <- rownames(desiredResult_base) # 调整列顺序和列名 desiredResult_base <- desiredResult_base[ , c("player", "shot", "pass", "score")] colnames(desiredResult_base) <- c("player", "shots", "passes", "scores") # 按player排序 desiredResult_base <- desiredResult_base[order(desiredResult_base$player), ] # 查看结果 desiredResult_base
这个方法同样能得到和目标一致的结果,适合偏好基础R语法的场景。
内容的提问来源于stack exchange,提问作者Daniel LeZotte
相关产品推荐
相关产品推荐

