从定义的列中减去第4列

时间:2018-07-23 21:49:45

标签: r

我试图找出一种从定义的列(例如A1-A,A2-A等)中减去第4列的方法,我想使它成为可与不同的列名和数据帧一起使用的函数不同大小。理想情况下,它将贯穿所有四个列(列A到D)。有小费吗?

<div class="outter">
  <div class="parent">
    <div class="child is-visible">1</div>
    <div class="child is-visible">2</div>
  </div>
</div>

<div class="outter">
  <div class="parent">
    <div class="child is-visible">1</div>
    <div class="child is-visible">2</div>
    <div class="child is-visible">3</div>
    <div class="child is-visible">4</div>
  </div>
</div>

我想要的结果是:

A   B   C   D   A1  B1  C1  D1  A2  B2  C2  D2
50  40  60  70  55  45  67  70  50  40  60  75
50  40  60  70  70  60  90  75  50  40  60  70
25  0   50  75  40  0   60  70  50  25  70  80

此功能很接近(从第1和第2减去第3列,然后从第4和第5减去第6列,依此类推),但我不知道如何调整它以适应我的需要:

A1  B1  C1  D1  A2  B2  C2  D2
5   5   7   0   0   0   0   5
20  20  30  5   0   0   0   0
15  0   10  -5  25  25  20  5

2 个答案:

答案 0 :(得分:2)

如果DF是输入data.frame(如末尾的注),则:

n <- 4
DF[-(1:n)] - as.matrix(DF[1:n])

给予:

  A1 B1 C1 D1 A2 B2 C2 D2
1  5  5  7  0  0  0  0  5
2 20 20 30  5  0  0  0  0
3 15  0 10 -5 25 25 20  5

注意

Lines <- "A   B   C   D   A1  B1  C1  D1  A2  B2  C2  D2
50  40  60  70  55  45  67  70  50  40  60  75
50  40  60  70  70  60  90  75  50  40  60  70
25  0   50  75  40  0   60  70  50  25  70  80
"
DF <- read.table(text = Lines, header = TRUE)

答案 1 :(得分:1)

使用apply的解决方案可以实现为:

n <- 4
t(apply(df,1,function(x)x[(n+1):length(x)]-rep(x[1:n],(length(x)-n)/n)))
#      A1 B1 C1 D1 A2 B2 C2 D2
# [1,]  5  5  7  0  0  0  0  5
# [2,] 20 20 30  5  0  0  0  0
# [3,] 15  0 10 -5 25 25 20  5

另一个选项可以是:

n <- 4
df[-(1:n)] - df[rep(1:n,(ncol(df)-n)/4)]
# A1 B1 C1 D1 A2 B2 C2 D2
# 1  5  5  7  0  0  0  0  5
# 2 20 20 30  5  0  0  0  0
# 3 15  0 10 -5 25 25 20  5

数据:

df <- read.table(text = 
"A   B   C   D   A1  B1  C1  D1  A2  B2  C2  D2
50  40  60  70  55  45  67  70  50  40  60  75
50  40  60  70  70  60  90  75  50  40  60  70
25  0   50  75  40  0   60  70  50  25  70  80",
header = TRUE)