在R语言中为数据框数据点分配量化变量并按组求和的实现
嘿,这个需求在R里其实很好实现,我给你拆成生成分组数据框和按组求和两步来做,不管是用dplyr这类工具包还是基础R都能搞定,下面结合你的示例数据详细说明:
第一步:创建示例数据(先还原你的测试数据)
首先咱们先把你给的dat1创建出来,方便后续测试:
dat1 <- data.frame( a = c(2.1,2.3,2.3), b = c(3.6,3.7,3.8), c = c(1.2,1.3,1.4), d = c(2.4, 2.3, 3.2), e = c(3.9, 1.2, 3.1) )
第二步:生成分组数据框dat2
我们需要给每个数据点按规则分配1/2/3,这里推荐两种方法:
方法1:用dplyr的case_when(直观易懂)
如果习惯用tidyverse工具链,case_when能清晰写出分组逻辑,还能处理特殊情况(比如数值小于1的情况,这里我设为NA,你可以按需调整):
library(dplyr) dat2 <- dat1 %>% mutate(across(everything(), ~case_when( .x >= 1 & .x < 2 ~ 1, # 1-2之间(不含2)分配1 .x >= 2 & .x < 3 ~ 2, # 2-3之间(不含3)分配2 .x >= 3 ~ 3, # 大于等于3分配3 TRUE ~ NA_real_ # 其他情况(比如小于1)设为NA )))
方法2:用基础R的ifelse嵌套(无需额外包)
如果不想加载dplyr,用基础R的嵌套ifelse也能实现同样效果:
dat2 <- as.data.frame(lapply(dat1, function(x) { ifelse(x >= 1 & x < 2, 1, ifelse(x >= 2 & x < 3, 2, ifelse(x >= 3, 3, NA))) }))
生成的dat2会是这样的:
a b c d e 1 2 3 1 2 3 2 2 3 1 2 1 3 2 3 1 3 3
第三步:按组求和生成dat3
接下来要对原数据框dat1的每一行,按dat2的分组分别求和。这里推荐矩阵操作法,效率更高(尤其适合你80个变量的数据集):
# 把数据框转成矩阵,方便逐行运算 mat1 <- as.matrix(dat1) mat2 <- as.matrix(dat2) # 按组计算每行的总和 dat3 <- data.frame( group1_sum = rowSums(mat1 * (mat2 == 1), na.rm = TRUE), group2_sum = rowSums(mat1 * (mat2 == 2), na.rm = TRUE), group3_sum = rowSums(mat1 * (mat2 == 3), na.rm = TRUE) )
如果你偏好dplyr风格,也可以用rowwise+summarize:
dat3 <- dat1 %>% rowwise() %>% summarize( group1_sum = sum(c_across(where(~dat2[cur_group_row(), cur_column()] == 1)), na.rm = TRUE), group2_sum = sum(c_across(where(~dat2[cur_group_row(), cur_column()] == 2)), na.rm = TRUE), group3_sum = sum(c_across(where(~dat2[cur_group_row(), cur_column()] == 3)), na.rm = TRUE) )
最终生成的dat3结果如下,完全符合你的需求:
group1_sum group2_sum group3_sum 1 1.20 4.50 7.50 2 2.50 4.60 3.70 3 1.40 2.30 10.10
内容的提问来源于stack exchange,提问作者Mataunited18
相关产品推荐
相关产品推荐

