有没有办法在 R 中添加两个连续的列?
Is there a way to make addition of two contiguos columns in 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
您可以使用向量回收到 select 列并添加它们。
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)))
我有一个数据框,其中每个观察结果都包含在两列中。这样,第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
您可以使用向量回收到 select 列并添加它们。
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)))