数据帧R中的成对减法

时间:2015-03-26 10:33:42

标签: r

我有一个包含576行和五列的数据框,如下所示:

Sample  Value1  Value2
A   23,2    NA
A   21,5    23,5
A   22,4    22,56
B   20,56   26,54
B   21,5    25,3
B   22,3    24,6
C   26,35   22,54
C   26,5    21,68
C   27,45   23,1

我需要逐个计算每组中的值之间的差异,得到如下结果:

Sample  Value1  Value2  Dif1    Dif2
A        23,2   NA       1,7    NA
A       21,5    23,5    0,9     0,94
A       22,4    22,56   0,8     NA
B      20,56    26,54   0,94    1,24
B       21,5    25,3    0,8     0,7
B       22,3    24,6    1,74    1,94
C      26,35    22,54   0,15    1,24
C       26,5    21,3    0,95    2,3
C      27,45    23,6    1,1     1,06

然后将差值大于2的主值更改为NA,如:

Sample  Value1  Value2  Dif1    Dif2
A        23,2     NA    1,7     NA
A       21,5     23,5   0,9     0,94
A       22,4     22,56  0,8     NA
B       20,56    26,54  0,94    1,24
B       21,5     25,3   0,8     0,7
B       22,3     24,6   1,74    1,94
C      26,35     22,54  0,15    1,24
C      26,5     21,3    0,95    2,3
C      27,45    NA      1,1     1,06

提前致谢

2 个答案:

答案 0 :(得分:0)

我认为以下应该适合你

df = read.table(header = T, dec = ',', text = 'Sample  Value1  Value2
A   23,2    NA
A   21,5    23,5
A   22,4    22,56
B   20,56   26,54
B   21,5    25,3
B   22,3    24,6
C   26,35   22,54
C   26,5    21,68
C   27,45   23,1')

library(data.table)
dt = as.data.table(df)
dt[,c('Dif1', 'Dif2') := list(diff(Value1),diff(Value2))]
dt[,c('Value1', 'Value2') := list(ifelse(Dif1>2, NA, Value1),ifelse(Dif2>2, NA, Value2))]

  Sample Value1 Value2  Dif1  Dif2
1:      A  23.20     NA -1.70    NA
2:      A  21.50  23.50  0.90 -0.94
3:      A  22.40     NA -1.84  3.98
4:      B  20.56  26.54  0.94 -1.24
5:      B  21.50  25.30  0.80 -0.70
6:      B     NA  24.60  4.05 -2.06
7:      C  26.35  22.54  0.15 -0.86
8:      C  26.50  21.68  0.95  1.42
9:      C  27.45     NA -1.70    NA

答案 1 :(得分:0)

你可以尝试

res <-  unsplit(lapply(split(df1, df1$Sample), function(x) {
     x1 <- cbind(x,apply(x[-1], 2, FUN=function(y)
               combn(y,2, function(.y) abs(.y[1]-.y[2]))))
      x1[2:3][x1[4:5]>2] <- NA
      x1[4:5] <- x1[c(1,3,2),4:5] 
      x1 }), df1$Sample)
colnames(res)[4:5] <- paste0('Dif', 1:2)
res
#    Sample Value1 Value2 Dif1 Dif2
# 1      A  23.20     NA 1.70   NA
# 2      A  21.50  23.50 0.90 0.94
# 3      A  22.40  22.56 0.80   NA
# 4      B  20.56  26.54 0.94 1.24
# 5      B  21.50  25.30 0.80 0.70
# 6      B  22.30  24.60 1.74 1.94
# 7      C  26.35  22.54 0.15 1.24
# 8      C  26.50  21.30 0.95 2.30
# 9      C  27.45     NA 1.10 1.06

数据

df1 <- read.table(text="Sample  Value1  Value2
  A   23,2    NA
  A   21,5    23,5
  A   22,4    22,56
  B   20,56   26,54
  B   21,5    25,3
  B   22,3    24,6
  C   26,35   22,54
  C   26,5    21,3
  C   27,45   23,6", sep="", header=TRUE, dec=',',stringsAsFactors=FALSE)