科研项目技术求助:按行汇总DataFrame指定列生成Group1
解决FRAMETRUE中1989-1995列按行求和生成Group1列的问题
我经常处理这类时序数据的行汇总需求,给你两个实用的解决方案,都能完美匹配你的需求:
方法一:基础R原生函数(快速直接)
用rowSums()是最直接的方式,它专门用来按行计算列的总和,还能轻松处理NA值:
# 选中1989到1995的列,按行求和,na.rm=TRUE自动忽略NA FRAMETRUE$Group1 <- rowSums(FRAMETRUE[, c("1989", "1990", "1991", "1992", "1993", "1994", "1995")], na.rm = TRUE)
如果你的数据里没有NA值,可以去掉na.rm=TRUE参数;如果需要保留NA(只要行内有一个NA就返回NA),也可以去掉这个参数。
方法二:dplyr包(tidyverse风格,代码更易读)
如果你习惯用tidyverse系列工具,dplyr的写法更直观,尤其适合后续还要做其他数据处理的场景:
library(dplyr) FRAMETRUE <- FRAMETRUE %>% rowwise() %>% # 告诉dplyr按行进行操作 mutate(Group1 = sum(c_across(1989:1995), na.rm = TRUE)) %>% # 选中1989-1995列求和 ungroup() # 取消按行分组,避免影响后续操作
这里c_across(1989:1995)能直接选中列名在1989到1995之间的列(因为你的列名是数字型/字符型年份,范围选择生效),如果列名是带引号的字符,写成c_across("1989":"1995")也可以。
验证结果
拿你给的示例数据测试:
- A行求和:3+3+5+2+3+4+2 = 22
- B行求和:7+1+2+4+5+0+4 = 23
- C行(忽略NA):10+15+1+3+2+2 = 33
- D行(忽略NA):7+0+5+3+6+4 = 25
- E行求和:5+1+2+4+0+3+5 = 20
这些结果都会准确存入新的Group1列里。
内容的提问来源于stack exchange,提问作者tnorio
相关产品推荐
相关产品推荐

