如果您只需要检查任何列是否是任何其他两列之和的结果,那么这里有一个想法将起作用。它还允许您添加噪音。我们基本上首先通过添加原始数据集的所有组合来创建一个数据框。然后,我们用创建的数据框减去数据集的每一列。如果所有值均为 0,则表示它们匹配。通过使用colSums(i < 0.01) == nrow(i))
,我们能够添加所需的噪声。
d2 <- setNames(data.frame(combn(1:ncol(d), 2, function(i) rowSums(d[i]))),
combn(names(d), 2, function(j)paste(j, collapse = ' + ')))
l1 <- lapply(d, function(i) sapply(d2, function(j) Map(function(x, y)abs(x - y), i, j)))
lapply(l1, function(i) names(which(colSums(i < 0.01) == nrow(i))))
#$a
#character(0)
#$b
#character(0)
#$c
#character(0)
#$d
#[1] "a + b"
#$e
#[1] "c + d"
或者使它成为一个函数noise
作为输入参数,
f1 <- function(df, noise){
d2 <- setNames(data.frame(combn(1:ncol(df), 2, function(i) rowSums(df[i]))),
combn(names(df), 2, function(j)paste(j, collapse = ' + ')))
l1 <- lapply(df, function(i) sapply(d2, function(j)
Map(function(x, y)abs(x - y), i, j)))
Filter(length, lapply(l1, function(i)
names(which(colSums(i < noise) == nrow(i)))))
}
f1(d, 0.01)
#$d
#[1] "a + b"
#$e
#[1] "c + d"
如果我们想让它更灵活,那么我们可以添加另一个参数来获取(列的)组合数,即
f1 <- function(df, n, noise){
d2 <- setNames(data.frame(combn(1:ncol(df), n, function(i) rowSums(df[i]))),
combn(names(df), n, function(j)paste(j, collapse = ' + ')))
l1 <- lapply(df, function(i) sapply(d2, function(j)
Map(function(x, y)abs(x - y), i, j)))
Filter(length, lapply(l1, function(i)
names(which(colSums(i < noise) == nrow(i)))))
}
sapply(2:3, function(i) f1(d, i, 0.01))
#[[1]]
#[[1]]$d
#[1] "a + b"
#[[1]]$e
#[1] "c + d"
#[[2]]
#[[2]]$e
#[1] "a + b + c"