首页 > 解决方案 > 对数据框中的列求和并将这些值添加到 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

标签: r

解决方案


我建议一种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

推荐阅读