如何获取 R 中选定列的 rowSums
How to get rowSums for selected columns in R
我是 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])
但是我的代码应该有问题。在此先感谢您的帮助。
明确指定两个求和:
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
我们可以将数据集 split
转换为 list
,然后将 Reduce
与 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
我的感觉是使用 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
好的,如果你想要一个单独的数据框:
> data.frame(X1=rowSums(data[,2:4]), X2=rowSums(data[,5:7]))
这是一个非常简单的解决方案,使用 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
rowSums(cbind(mydata$variable1, mydata$variable2, mydata$variable3), na.rm = T )
所以,我遇到了类似的问题
我在两次不同的时间给出了 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 需要一个数据框。 以上。但是技巧就变成了如何以编程方式做到这一点。
嗯,第一个'.' in rowSums 是管道 (df1) 传递的数据集中 columns/variables 的完整集合。但是你想对其进行子集化。
所以,这就是 grepl 工作得很好的地方。您可以使用 grepl 使用以下语法对数据帧进行子集化:dataframe[,grepl("pattern",colnames(dataframe))]
所以,在我上面的代码中 rowSums(.[grepl('\.a$',colnames(.))])
诀窍是用 '.' 替换 'dataframe'点符号。
我是 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])
但是我的代码应该有问题。在此先感谢您的帮助。
明确指定两个求和:
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
我们可以将数据集 split
转换为 list
,然后将 Reduce
与 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
我的感觉是使用 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
好的,如果你想要一个单独的数据框:
> data.frame(X1=rowSums(data[,2:4]), X2=rowSums(data[,5:7]))
这是一个非常简单的解决方案,使用 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
rowSums(cbind(mydata$variable1, mydata$variable2, mydata$variable3), na.rm = T )
所以,我遇到了类似的问题
我在两次不同的时间给出了 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 需要一个数据框。
嗯,第一个'.' in rowSums 是管道 (df1) 传递的数据集中 columns/variables 的完整集合。但是你想对其进行子集化。
所以,这就是 grepl 工作得很好的地方。您可以使用 grepl 使用以下语法对数据帧进行子集化:dataframe[,grepl("pattern",colnames(dataframe))]
所以,在我上面的代码中 rowSums(.[grepl('\.a$',colnames(.))])
诀窍是用 '.' 替换 'dataframe'点符号。