r - 对数据框中的列求和并将这些值添加到 R 中的新数据框中
问题描述
我正在尝试对数据框的列求和并将这些总和添加到新的输出数据框。当我运行以下脚本时,我收到一条错误消息,指出替换有两行,数据有 3。
a <-data.frame(replicate(3,sample(1:100,10,rep=TRUE)))
colnames(a) <- c("name1", "name2","name3")
for (i in 1:ncol(a)) {
b <-as.data.frame(names(a))
c <- sum(a[i])
b$d[i] <- c[i]
}
我正在寻找作为数据框的输出,例如:name1 sum1 name2 sum2 name3 sum3
解决方案
我建议一种dplyr
方法:
library(dplyr)
#Data
a <-data.frame(replicate(3,sample(1:100,10,rep=TRUE)))
colnames(a) <- c("name1", "name2","name3")
#Code
a %>%
mutate(across(c(name1:name3),.fns = list(sum = ~ sum(.,na.rm=T)) ))
输出:
name1 name2 name3 name1_sum name2_sum name3_sum
1 98 31 79 599 489 506
2 8 71 4 599 489 506
3 59 23 48 599 489 506
4 65 76 64 599 489 506
5 47 53 57 599 489 506
6 80 84 55 599 489 506
7 40 19 28 599 489 506
8 39 2 47 599 489 506
9 65 36 40 599 489 506
10 98 94 84 599 489 506
如果只需要一个数据框,您可以使用它:
a %>%
summarise(across(c(name1:name3),.fns = list(sum = ~ sum(.,na.rm=T)) ))
输出:
name1_sum name2_sum name3_sum
1 599 489 506
当您要将这些变量添加到同一数据帧时,应使用初始代码。
如果您想要一个变量作为名称,另一个变量作为结果,您可以使用以前的代码和pivot_longer()
fromtidyverse
来产生这个:
library(tidyverse)
#Code
a %>%
summarise(across(c(name1:name3),.fns = list(sum = ~ sum(.,na.rm=T)) )) %>%
pivot_longer(cols = everything())
输出:
# A tibble: 3 x 2
name value
<chr> <int>
1 name1_sum 599
2 name2_sum 489
3 name3_sum 506
推荐阅读
- gerrit - 如何将 Gerrit 草稿提交提升为常规代码审查提交
- kdb - 比较两个不同实例中的表
- sql-server-2016 - 将 .dbf 文件从本地系统读取/导入到 SQL Server 2016 64 位的命令
- python - 使用 Python Pandas 循环将不同的 .csv 文件读入不同的数据帧
- module - 我应该如何访问模块中的其他模块?
- mysql - 在 MySQL 中选择直到
- node.js - 在不同模型上带有续集的生命周期钩子
- spring - 使用 Java 10 的 Gradle(即使包未导出,Spring 也能够扫描模块类)
- c# - 使用 IText 7 将 PDF 转换为 PDF/A?
- c# - 阻止文本框 UWP 的不同方法