我有一个包含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
提前致谢
答案 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)