从数据帧中的奇数列中减去偶数列

时间:2018-11-06 21:39:26

标签: r dataframe

我有一个数据框(实际上我有170列(85对)和约8000行)

data <- data.frame(A = c(6,5,4,3), B = c(2,2,2,2), C = c(9,8,7,6), D = c(2,2,2,2))

对于所有行,我想从第1列减去第2列,从第3列减去第4列,等等。

我认为我需要尝试编写函数或以某种方式使用Apply。

5 个答案:

答案 0 :(得分:6)

R具有矢量化操作,可在一次调用中处理此类任务:

data[c(1,3)] - data[c(2,4)]
## or for every column until the end of the dataset
data[seq(1,ncol(data),2)] - data[seq(2,ncol(data),2)]
#  A C
#1 4 7
#2 3 6
#3 2 5
#4 1 4

有关大量有用的建议,请参见前面的讨论-Selecting multiple odd or even columns/rows for dataframe

您可以扩展此名称,以便自动完成命名:

s <- seq(1,ncol(data),2)
data[paste0(names(data[s]), "minus", names(data)[-s])] <- data[s] - data[-s]
data

#  A B C D AminusB CminusD
#1 6 2 9 2       4       7
#2 5 2 8 2       3       6
#3 4 2 7 2       2       5
#4 3 2 6 2       1       4

答案 1 :(得分:4)

您可以使用c(TRUE,FALSE)或其否定选择每隔一列。二进制减号具有数据框方法:

data[c(TRUE,FALSE)] - data[c(FALSE,TRUE)]
  A C
1 4 7
2 3 6
3 2 5
4 1 4

如果要命名,则有意义,您可以在名称上使用paste

 paste( names(data[c(TRUE,FALSE)]) , "_minus_", names( data[c(FALSE,TRUE)]) )

答案 2 :(得分:3)

data.frame上的许多基本运算都是矢量化的,这意味着加,减,乘等是元素明智的。即以下作品:

data <- data.frame(A = c(6,5,4,3), B = c(2,2,2,2), C = c(9,8,7,6), D = c(2,2,2,2))

data$AminusB <- data$A - data$B
data$CminusD <- data$C - data$D

print(data)
#  A B C D AminusB CminusD
#1 6 2 9 2       4       7
#2 5 2 8 2       3       6
#3 4 2 7 2       2       5
#4 3 2 6 2       1       4

您还可以通过data[4]data[,4]data[,"D"]等访问第4列。参见help("[")。根据您想要输出的方式,有很多选择方法。使用简单的for循环,您可以遍历您的列并进行所有更改。

答案 3 :(得分:2)

有170列,指定每个列名称将令人生畏。 如果所有列都是数字,则可以执行以下操作:

Group   Error  
1           a  
1           b  
1           c    
2           a  
2           b  
3           a

减去列:

#Sample data
set.seed(123)
df <- data.frame(x = floor(rnorm(5, 10, 2)),
                 y = floor(rnorm(5, 30, 2)),
                 z = floor(rnorm(5, 50, 2)))
   x  y  z
1  8 33 52
2  9 30 50
3 13 27 50
4 10 28 50
5 10 29 48    

答案 4 :(得分:2)

使用apply的另一种方法:

-t(apply(data, 1, diff))[ , seq(1, ncol(data)-1, by=2)]

#      B D
# [1,] 4 7
# [2,] 3 6
# [3,] 2 5
# [4,] 1 4
相关问题