Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:通过在最小条件内配对值来扩展数据帧_R - Fatal编程技术网

R:通过在最小条件内配对值来扩展数据帧

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)]

我有一个包含两列(“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)]
        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>