Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中跨多个列高效求和_R_Sum - Fatal编程技术网

在R中跨多个列高效求和

在R中跨多个列高效求和,r,sum,R,Sum,我有以下压缩数据集: a<-as.data.frame(c(2000:2005)) a$Col1<-c(1:6) a$Col2<-seq(2,12,2) colnames(a)<-c("year","Col1","Col2") for (i in 1:2){ a[[paste("Var_", i, sep="")]]<-i*a[[paste("Col", i, sep="")]] } 我想对我使用的Var1和Var2列求和: a$sum<-a$Var

我有以下压缩数据集:

a<-as.data.frame(c(2000:2005))
a$Col1<-c(1:6)
a$Col2<-seq(2,12,2)

colnames(a)<-c("year","Col1","Col2")

for (i in 1:2){
  a[[paste("Var_", i, sep="")]]<-i*a[[paste("Col", i, sep="")]]
}
我想对我使用的Var1和Var2列求和:

a$sum<-a$Var_1 + a$Var_2
实际上,我的数据集要大得多——我想从Var_1到Var_n的总和可以达到20。必须有一种比以下更有效的方法:

 a$sum<-a$Var_1 + ... + a$Var_n

您可以使用colSumsa[,cVar1,Var2]或rowSumsa[,cVar_1,varu 2]。在您的情况下,您需要后者。

这里有一个使用tidyverse的解决方案。可以使用select函数在mutate中选择适当的列,将其扩展到任意多的列

图书馆管理员 a 4 2003 4 8 4 16 > 5 2004 5 10 5 20 > 6 2005 6 12 6 24 Tidyverse溶液 a%>% mutateTotal=select.,Var_1:Var_2%>%rowSumsna.rm=TRUE >第1列第2列第1列第2列第2列总计 > 1 2000 1 2 1 4 5 > 2 2001 2 4 2 8 10 > 3 2002 3 6 3 12 15 > 4 2003 4 8 4 16 20 > 5 2004 5 10 5 20 25 > 6 2005 6 12 6 24 30
由v0.2.1于2019-01-01创建,如果您使用的是非常大的数据集,行和可能会很慢

另一种方法是使用包中的rowsums函数。这要求您在过程中将数据转换为矩阵,并使用列索引而不是名称。下面是一个基于您的代码的示例:

## load Rfast
library(Rfast)

## create dataset
a <- as.data.frame(c(2000:2005))
a$Col1 <- c(1:6)
a$Col2 <- seq(2,12,2)

colnames(a) <- c("year","Col1","Col2")

for (i in 1:2){
  a[[paste("Var_", i, sep="")]] <- i*a[[paste("Col", i, sep="")]]
}

## get column indices based on names
col_st <- grep("Var_1", colnames(a))  # index of "Var_1" col
col_en <- grep("Var_2", colnames(a))  # index of "Var_2" col
cols   <- c(col_st:col_en)  # indices of all cols from "Var_1" to "Var_2"

## sum rows 4 to 5
a$Total <- rowsums(as.matrix(a[,cols]))
使用dplyr,您可以使用

a %>%
rowwise() %>%
mutate(sum = sum(Col1,Col1, na.rm = T))
或者更有效

a %>%
rowwise() %>%
mutate(sum = sum(across(starts_with("Col")), na.rm = T))

尝试使用apply:a$sum谢谢,在以下情况下效果很好:i是Var_1的列索引,j是Var_n a$sum的列索引,并使用$sum a$Col3进一步自动化过程