从df中的另一行中减去一行

时间:2016-03-09 12:51:29

标签: r

我有DF,看起来像

DF
Nrow  a   b    c   d
1     0.1 0.2 0.3 0.4 
2      2   3   4   5
3      7   8   9   10

我想从第2行和第3行中减去第1行。

我该怎么办? 感谢您的任何提示。

更新

我看到了这段代码:within-group differences from group member,并尝试了它。

编辑我的数据:

newdf <- df[!is.na(S[,1]),] ## df有NA值干扰分析,所以我删除了它们。

df <- data.frame(treatment = rep(c('','baseline', 'treatment 1', 'treatment 2'), times=372),S[c(1:258)])

A <- df %>% mutate_each(funs(. - .[treatment=="baseline"]), -treatment) %>% filter(treatment!="baseline") ##有多个列,我想为其计算行方式更改

View(A)

然而,现在我想要得到正确的结果(或绝对变化,即第2行 - 第1行),但这些值与我手动计算的值不同。有什么想法吗?

谢谢!

回答11.03.2016

2-y Axes Plot with calculated absolute & relative Change in R

4 个答案:

答案 0 :(得分:0)

如果我们需要从多行中减去一行,我们可以rep单行将维度设置为具有多行的数据集子集,然后进行减法。

DF[2:3, -1]- DF[rep(1,2),-1]
#   a   b   c   d
#2 1.9 2.8 3.7 4.6
#3 6.9 7.8 8.7 9.6

数据

DF <- structure(list(Nrow = 1:3, a = c(0.1, 2, 7), b = c(0.2, 3, 8), 
c = c(0.3, 4, 9), d = c(0.4, 5, 10)), .Names = c("Nrow", 
"a", "b", "c", "d"), class = "data.frame",
 row.names = c(NA, -3L))

答案 1 :(得分:0)

使用索引查看行...

df <- read.table(textConnection("Nrow  a   b    c   d
1     0.1 0.2 0.3 0.4 
2      2   3   4   5
3      7   8   9   10"), stringsAsFactors=FALSE, header=TRUE)

df[1, ] - df[2, ]
# or assign the result to a new row...
df <- rbind(df, df[1, ] - df[2, ])

答案 2 :(得分:0)

以下命令将执行从下面所有行中减去第1行的操作,并将从下面的行中打印第1行的减法结果。

 data = data.frame(x=c(1,5,7,10),y=c(3,2,4,1.1),z=1:4)
 data
 #    x    y  z
 # 1  1  3.0  1
 # 2  5  2.0  2
 # 3  7  4.0  3
 # 4 10  1.1  4

 for(i in 2:nrow(data)){
 result = data[i,] - data[1,]
 print (result)
 }

 #     x   y  z    
 # 2   4  -1  1     <--- 2nd row minus 1st row

 #     x   y  z
 # 3   6   1  2     <--- 3rd row minus 1st row

 #     x   y  z
 # 4   9 -1.9 3     <--- 4th row minus 1st row

希望这有帮助。您可以对数据中的任意行使用相同的命令。

答案 3 :(得分:0)

回答11.03.2016 #thought它可能会帮助其他人

这就是我最终做到的:

library(dplyr) dft1= filter(df, df$time==1) dft2= filter(df, df$time==2) dft3= filter(df, df$time==3)

您可能需要根据数据集重命名数据框或列。

计算从第二个时间点到第一个时间点的绝对变化。第三到第一时间点: abs1=dft2[33:290] - dft1[33:290]

abs2=dft3[33:290] - dft1[33:290]

计算从第二个时间点到第一个时间点的相对变化。第三到第一时间点: rel1=abs1/dft1[33:290]*100

rel2=abs2/dft1[33:290]*100