我有一个数据框(实际上我有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。
答案 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