r - 如何创建数据框每一列的累积和
问题描述
我在尝试解决这个问题时遇到了一些麻烦。我有一个数据框 4 个变量:
rr_1 rr_2 cc_1 cc_2
100 0 1 0
200 100 1 1
300 300 1 1
400 500 1 1
0 0 0 0
每次相应的 rr 变量的值大于 0 时,我的 cc 变量的值都为 1。我想要完成的是为 cc 变量创建一个累积序列,这样最终结果应该如下所示:
rr_1 rr_2 cc_1 cc_2
100 0 1 0
200 100 2 1
300 300 3 2
400 500 4 3
0 0 4 3
我已经尝试了几件事来解决这个问题。
(1) 我创建了一个函数,例如:
df <- df1 %>% select(starts_with("cc"))
rows <- nrow(df)
cc_cum <- function(x) {
for(i in 2:rows) {
df$x[i] <- df$x[i-1] + df$x[i]
}
apply(df, 2, cc_cum)
(2) 我创建了向量:
df <- df1 %>% select(starts_with("cc"))
cc_cum <- function(x) {
x <- as.vector(df$x)
x <- cumsum(x)
df$x <- x
}
apply(df, 2, cc_cum )
(3) 我也试过:
df <- df1 %>% select(starts_with("cc"))
rows <- nrow(df)
cc_cum <- function(x) {
for(i in 2:rows) {
df$x[i] <- df$x[i-1] + df$x[i]
}
}
apply(df, 2, cc_cum)
奇怪的是,如果我从函数和应用程序中删除它们,我上面尝试的所有解决方案都适用于每一列。例如,此代码有效
df <- df1 %>% select(starts_with("cc"))
rows <- nrow(df)
for(i in 2:rows) {
df$cc_1[i] <- df$cc_1[i-1] + df$cc_1[i]
}
但是,此代码将用于具有多个 cc 级别的更大数据集,因此我无法预测会有多少,因此我无法真正编写 cc 的所有可能性。
对此的任何反馈都将非常有帮助。
解决方案
对多列使用内置cumsum
函数lapply
cols <- grep("^cc", names(df))
df[cols] <- lapply(df[cols], cumsum)
df
# rr_1 rr_2 cc_1 cc_2
#1 100 0 1 0
#2 200 100 2 1
#3 300 300 3 2
#4 400 500 4 3
#5 0 0 4 3
或者dplyr
,我们可以使用mutate_at
来选择特定的列
library(dplyr)
df %>% mutate_at(vars(starts_with("cc")), cumsum)
推荐阅读
- java - 执行时 Netbeans JavaSE 组件大小不同
- amazon-web-services - S3跨账户访问涉及3个账户
- wso2 - WSO2 ESB 6.1.0 批处理
- node.js - 服务器端的 SuperCluster
- computer-vision - 读取激光雷达数据
- python - 使用 scapy 嗅探 http 数据包
- angular - 如何使用 *ngIf 'not equal to' 来检查条件
- excel - 用户窗体根据单元格值更改文本框颜色
- json.net - 如何使用 json.net 在 Visual Basic 中创建 JSON 字符串?
- git - 如何恢复我在 git 上的推送或提交