r - 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
解决方案
如果我理解正确,OP 期望新列的所有行cs
都是空白的,除了每个组的最后一行应该打印属于该组的值的总和。
仅当新列的类型为character时,才可能出现空白行。如果预期为数字类型,则没有其他选择可以打印,或任何其他数值,但不能打印(空字符串)。cs
cs
0
NA
""
因此,下面有一些建议可以通过使用来创建字符列
ifelse()
, 或者replace()
和rep()
, 或c()
和rep()
。
在data.table
和dplyr
语法,分别。
请注意,根本不需要 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"
推荐阅读
- mysql - MYSQL PRIMARY CHAR KEY 的最大最佳大小是多少
- android - 由于 Android 中的数据存储迁移,应用升级后应用崩溃
- python - 如何访问项目根文件夹中的文件?
- c++ - 在 C++ 中创建具有不同参数的多个构造函数的正确方法?
- python - matplotlib 中“关闭”路径参数的含义
- java - Java Annotation如何获取特定注解的当前ElemenType
- python - Pandas - 从 Pandas 中的同一字符串中选择几个浮点数来操作它们
- python - 用于动态分组的 Python pandas 小计,如何让总数始终出现在分组的末尾?
- node.js - 使用 Promise.all() 结果执行另一个查询的语法
- .htaccess - 也将非 www 重定向到 www 子页面