有没有办法在R中添加两个连续柱



我有一个数据框架,其中每个观察都包含在两列中。这样,列1和2表示个体1,列3和列4表示个体2,依此类推

基本上,我想做的是添加两个连续列,这样我就有了个人的真实分数。

在该示例中,V1和V2表示个体I,V3和V4表示个体II。因此,对于结果数据帧,我将有一半的列,相同数量的行,每个值将是两个连续列之间的每个值的相加。

数据

V1 V2 V3 V4
1  0  0  1  1
2  1  0  0  0
3  0  1  1  1
4  0  1  0  1

所需输出

I II
1 0  2
2 1  0
3 1  2
4 1  1

我试过这种

a <- data.frame(V1= c(0,1,0,0),V2=c(0,0,1,1),V3=c(1,0,1,0),V4=c(1,0,1,1))
b <- data.frame(NA, nrow = nrow(a), ncol = ncol(data))
for (i in seq(2,ncol(a),by=2)){
for (k in 1:nrow(a)){
b[k,i] <- a[k,i] + a[k,i-1]
}
}
b <- as.data.frame(b)
b <- b[,-c(seq(1,length(b),by=2))]

有没有办法让它更简单?

我们可以使用split.default来分割数据,然后通过在list上循环来执行rowSums

sapply(split.default(a, as.integer(gl(ncol(a), 2, ncol(a)))), rowSums)
1 2
[1,] 0 2
[2,] 1 0
[3,] 1 2
[4,] 1 1

您可以使用向量回收来选择列并添加它们。

res <- a[c(TRUE, FALSE)] + a[c(FALSE, TRUE)]
names(res) <- paste0('col', seq_along(res))
res
#  col1 col2
#1    0    2
#2    1    0
#3    1    2
#4    1    1

dplyr的逐行操作方法(逐行是每行分组的一种特殊类型(

a <- data.frame(V1= c(0,1,0,0),V2=c(0,0,1,1),V3=c(1,0,1,0),V4=c(1,0,1,1))
library(dplyr)
a%>%
rowwise()%>%
transmute(I=sum(c(V1,V2)),
II=sum(c(V3,V4)))

或者可替换地,具有总和的内置的按行变体

a %>% transmute(I = rowSums(across(1:2)),
II = rowSums(across(3:4)))

最新更新