4

我是 R 的新手,并寻求帮助来计算每一行的选定列的总和。我的简单数据框如下。

data = data.frame(location = c("a","b","c","d"),
            v1 = c(3,4,3,3), v2 = c(4,56,3,88), v3 =c(7,6,2,9), v4=c(7,6,1,9),
            v5 =c(4,4,7,9), v6 = c(2,8,4,6))

我想要新数据框中每一行的 V1 到 V3 列和 V4 到 V6 列的总和。

   x1   x2
a  14   13   
b  66   18
c
d

我做了类似下面的事情。

rowSums(data[,2:4][,5:7])

但是我的代码应该有问题。提前感谢您的帮助。

4

7 回答 7

7

我的感觉是使用 dply:

require(dply)
data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6))

结果:

> newDf <- data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6))
> newDf
  v2v4 v4v6
1   14   13
2   66   18
3    8   12
4  100   24
于 2016-05-07T07:18:19.980 回答
3

这是一个非常简单的解决方案,使用apply.

output <- data.frame( x1 = apply(data[2:4], 1, sum) ,
                      x2 = apply(data[5:7], 1, sum) )

结果:

output
>    x1 x2
> 1  14 13
> 2  66 18
> 3   8 12
> 4 100 24
于 2016-05-07T13:26:55.983 回答
3
rowSums(cbind(mydata$variable1, mydata$variable2, mydata$variable3), na.rm = T )
于 2018-08-14T19:56:52.957 回答
2

好的,如果你想要一个单独的数据框:

> data.frame(X1=rowSums(data[,2:4]), X2=rowSums(data[,5:7]))
于 2016-05-07T11:42:54.247 回答
1

明确指定两个总和:

cbind(x1=rowSums(data[,c('v1','v2','v3')]),x2=rowSums(data[,c('v4','v5','v6')]));
##       x1 x2
## [1,]  14 13
## [2,]  66 18
## [3,]   8 12
## [4,] 100 24
于 2016-05-07T06:49:21.150 回答
0

我们可以split将数据集放入 a 中list,然后使用Reducewith f="+"

sapply(split.default(data[-1], rep(paste0("x", 1:2), each=3)), Reduce, f=`+`)
#     x1 x2
#[1,]  14 13
#[2,]  66 18
#[3,]   8 12
#[4,] 100 24
于 2016-05-07T06:52:50.140 回答
0

所以,我遇到了类似的问题

我在 2 个不同的时间对 20 个问题进行了相同的调查,因此有 2 个不同的调查分数,总共 40 列。每个调查问题都以标识符结尾。例如,调查的第一个问题通过添加 .a 或 .c 来区分:

Survey1Question1.a
Survey1Question1.c

假设您的数据在 df1 中,并且您希望对每个调查中的所有列求和,以便您有 2 个调查分数:

df1 %>% mutate(Survey.A = rowSums(.[grepl('\\.a$',colnames(.))]),
        Survey2 = rowSums(.[grepl('\\.c$',colnames(.))]),
        )

# A tibble: 9 x 2
  Survey.A Survey.C
     <dbl>   <dbl>
1       64      51
2       89      91
3       62      60
4       80      80
5       66      69
6       60      61
7       71      74
8       52      50
9       79      69

我只是在学习如何使用“。” 点符号。但我相信这是可行的,因为 rowSums 需要一个数据框。 这意味着您可以按照上面 Technophobe1 的回答。但是诀窍就变成了如何以编程方式做到这一点。

嗯,第一个'。在 rowSums 中是管道 (df1) 传递的数据集中的完整列/变量集。但是您想对其进行子集化。

所以,这里是 grepl 运作良好的地方。您可以使用以下语法使用 grepl 子集数据帧:dataframe[,grepl("pattern",colnames(dataframe))]

所以,在我上面rowSums(.[grepl('\\.a$',colnames(.))])的代码中,诀窍是用“。”替换“数据框”。点符号。

于 2021-03-04T22:48:17.620 回答