获取返回列表的数据帧的两列之间的顺序匹配

时间:2014-11-10 00:44:52

标签: r

我有两个变量的数据框(Var1和Var2)。基于先前建立的两个值之间的特征差异,已经匹配数据帧的每一行的两个元素。即397.1074与510.2119匹配,436.4694与510.2119匹配。

matches <- data.frame(
  Var1 = c(397.1074, 436.4694, 510.2119, 581.2889, 761.0372, 851.5489, 860.3277, 861.0612, 851.5489, 860.3277, 861.0612, 860.3277, 861.0612, 861.0612,
871.4374, 861.0612, 871.4374),
  Var2=c(510.2119, 510.2119, 581.2889, 728.2789, 860.3277, 924.9473, 924.9473, 924.9473, 925.7278, 925.7278, 925.7278, 934.1579, 934.1579, 935.0957,
935.0957, 943.1851, 943.1851)
 ) 
matches
#        Var1     Var2
# 1  397.1074 510.2119
# 2  436.4694 510.2119
# 3  510.2119 581.2889
# 4  581.2889 728.2789
# 5  761.0372 860.3277
# 6  851.5489 924.9473
# 7  860.3277 924.9473
# 8  861.0612 924.9473
# 9  851.5489 925.7278
# 10 860.3277 925.7278
# 11 861.0612 925.7278
# 12 860.3277 934.1579
# 13 861.0612 934.1579
# 14 861.0612 935.0957
# 15 871.4374 935.0957
# 16 861.0612 943.1851
# 17 871.4374 943.1851

然而,我正在尝试做的并且不知道适合该任务的函数或包是从一列到另一列中识别变量匹配的完整链。

即。 397.1074与第一行中的510.2119匹配。 510.2119与第3行中的581.2889相匹配。 581.2889与第4行的728.2789匹配。这将一直持续到第2列的值不再与第1列中的值匹配为止。

因此,在这种情况下,第一个匹配链将是长度为4的向量,最好作为列表中的元素返回:

[[1]]
[1] 397.1074 510.2119 581.2889 728.2789

结果中的第二个列表元素是:

[[2]]
[1] 436.4694 510.2119 581.2889 728.2789

[[3]] .... Etc.

列表结果将包含第1列和第2列中的所有匹配元素。即使是长度仅为2的那些元素。

1 个答案:

答案 0 :(得分:0)

可能效率不高的方法可能是:

ff = function(var2)  # a function to, recursively, match each match
{ 
   res = c(var2, matches$Var2[match(tail(var2, 1), matches$Var1)])
   if(!is.na(tail(res, 1))) res = Recall(res)
   return(c(na.omit(res)))
}

lapply(seq_len(nrow(matches)), 
       function(i) c(matches$Var1[i], ff(matches$Var2[i])))
#[[1]]
#[1] 397.1074 510.2119 581.2889 728.2789
#
#[[2]]
#[1] 436.4694 510.2119 581.2889 728.2789
#
#[[3]]
#[1] 510.2119 581.2889 728.2789
#
#[[4]]
#[1] 581.2889 728.2789
#
#[[5]]
#[1] 761.0372 860.3277 924.9473
#
#[[6]]
#[1] 851.5489 924.9473
#
#[[7]]
#[1] 860.3277 924.9473
#....