首页 > 解决方案 > for 循环对数据组求和并对其进行排列,然后在忽略 NA 时中断并打印该值

问题描述

我如何使用 for 循环按组对数据求和,然后分别打破并打印 A 和 B 的值累积和?IE:

Type value
A  2
A  NA
A  13  15
B  565
B  245
B  578  1388
library(dplyr)
df %>% 
  group_by(Type) %>% 
  mutate(cs = cumsum(value, na.rm = True)) 

但它只显示整个表格,最初应该是 sum A 应该是 15 但最终变成 NA。

Type value cs
A     2    2
A     NA   NA
A     13   NA
B     565  565
B     245  810
B     578  1388

标签: r

解决方案


如果我理解正确,OP 期望新列的所有行cs都是空白的,除了每个组的最后一行应该打印属于该组的值的总和。

仅当新列的类型为character时,才可能出现空白。如果预期为数字类型,则没有其他选择可以打印,或任何其他数值,但不能打印(空字符串)。cscs0NA""

因此,下面有一些建议可以通过使用来创建字符列

  • ifelse(), 或者
  • replace()rep(), 或
  • c()rep()

data.tabledplyr语法,分别。

请注意,根本不需要 for循环。

data.table

library(data.table)
setDT(df)[, cs := fifelse(1:.N == .N, as.character(sum(value, na.rm = TRUE)), ""), by = Type][]

或者

setDT(df)[, cs := replace(rep("", .N), .N, sum(value, na.rm = TRUE)), by = Type][]

或者

setDT(df)[, cs := c(rep("", .N - 1L), sum(value, na.rm = TRUE)), by = Type][]
   Type value   cs
1:    A     2     
2:    A    NA     
3:    A    13   15
4:    B   565     
5:    B   245     
6:    B   578 1388

dplyr

library(dplyr)
df %>% 
  group_by(Type) %>% 
  mutate(cs = ifelse(row_number() == n()), sum(value, na.rm = TRUE), ""))

或者

df %>% 
  group_by(Type) %>% 
  mutate(cs = replace(rep("", n()), n(), sum(value, na.rm = TRUE)))

或者

df %>% 
  group_by(Type) %>% 
  mutate(cs = c(rep("", n() - 1L), sum(value, na.rm = TRUE)))
# A tibble: 6 x 3
# Groups:   Type [2]
  Type  value cs    
  <chr> <int> <chr> 
1 A         2 ""    
2 A        NA ""    
3 A        13 "15"  
4 B       565 ""    
5 B       245 ""    
6 B       578 "1388"

推荐阅读