簡體   English   中英

獲取數據幀的兩列之間的順序匹配並返回列表

[英]Obtaining sequential matches between two columns of a data frame returning a list

我有兩個變量(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與第三行的581.2889相匹配。 581.2889與第四行的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中的所有匹配元素。即使長度只有兩個。

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

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
#....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM