我试图找出一种从定义的列(例如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
答案 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)