R:通过在最小条件内配对值来扩展数据帧
我有一个包含两列(“delta”和“let”)的数据帧。“let”中的值表示独特的因素。“delta”中的值表示0–1000000之间的任何整数 下面是示例数据帧(df):R:通过在最小条件内配对值来扩展数据帧,r,R,我有一个包含两列(“delta”和“let”)的数据帧。“let”中的值表示独特的因素。“delta”中的值表示0–1000000之间的任何整数 下面是示例数据帧(df): df您可以编写递归函数来解决该问题: find.pair <- function(df) { if(nrow(df) == 0) data.frame() else { pairs = df$let[c(F, cumsum(df$delta[-1]) <= 2)]
df您可以编写递归函数来解决该问题:
find.pair <- function(df) {
if(nrow(df) == 0) data.frame()
else {
pairs = df$let[c(F, cumsum(df$delta[-1]) <= 2)]
if(length(pairs) == 0) {
rbind(data.frame(let = df$let[1], let.pairs = NA),
find.pair(df[-1,]))
}
else {
rbind(data.frame(let = df$let[1],
let.pairs = pairs),
data.frame(let = pairs,
let.pairs = df$let[1]),
find.pair(df[-1,]))
}
}
}
find.pair另一个选项
x <- setNames(cumsum(df$delta), df$let)
pairs <- NULL
for (lag in seq(length(x) - 1L)) {
tmp <- which(diff(x, lag) <= minDelta) + lag
if (length(tmp))
pairs[[lag]] <- cbind(names(x)[tmp], names(x)[tmp - lag])
else
break
}
pairs <- do.call(rbind, pairs)
pairs <- rbind(pairs, pairs[, c(2, 1)])
pairs <- rbind(pairs, cbind(setdiff(names(x), pairs[, 1]), NA))
pairs <- pairs[order(pairs[, 1]), ]
data.frame(let=pairs[, 1], let.pairs=pairs[, 2])
# let let.pairs
#1 a <NA>
#2 b c
#3 c b
#4 d <NA>
#5 e <NA>
#6 f <NA>
#7 g h
#8 g i
#9 h g
#10 h i
#11 i h
#12 i g
#13 j <NA>
x
find.pair <- function(df) {
if(nrow(df) == 0) data.frame()
else {
pairs = df$let[c(F, cumsum(df$delta[-1]) <= 2)]
if(length(pairs) == 0) {
rbind(data.frame(let = df$let[1], let.pairs = NA),
find.pair(df[-1,]))
}
else {
rbind(data.frame(let = df$let[1],
let.pairs = pairs),
data.frame(let = pairs,
let.pairs = df$let[1]),
find.pair(df[-1,]))
}
}
}
find.pair(df)
# let let.pairs
# 1 a <NA>
# 2 b c
# 3 c b
# 4 c <NA>
# 5 d <NA>
# 6 e <NA>
# 7 f <NA>
# 8 g h
# 9 g i
# 10 h g
# 11 i g
# 12 h i
# 13 i h
# 14 i <NA>
# 15 j <NA>
x <- setNames(cumsum(df$delta), df$let)
pairs <- NULL
for (lag in seq(length(x) - 1L)) {
tmp <- which(diff(x, lag) <= minDelta) + lag
if (length(tmp))
pairs[[lag]] <- cbind(names(x)[tmp], names(x)[tmp - lag])
else
break
}
pairs <- do.call(rbind, pairs)
pairs <- rbind(pairs, pairs[, c(2, 1)])
pairs <- rbind(pairs, cbind(setdiff(names(x), pairs[, 1]), NA))
pairs <- pairs[order(pairs[, 1]), ]
data.frame(let=pairs[, 1], let.pairs=pairs[, 2])
# let let.pairs
#1 a <NA>
#2 b c
#3 c b
#4 d <NA>
#5 e <NA>
#6 f <NA>
#7 g h
#8 g i
#9 h g
#10 h i
#11 i h
#12 i g
#13 j <NA>