在R中,跨两个数据帧匹配来自字符串变量的数据,找到匹配项后,合并相应的行

时间:2019-04-13 13:40:57

标签: r string for-loop merge match

我有两个数据帧df1(4x4)和df2(4x1)。在每个变量中,第一个变量(即Original_items和Reordered)是字符串。在df1中,V2:V4是数字。您可以看到在df1和df2中,第一个变量中的数据以不同的顺序排列。我需要执行以下操作。

采用df2“重新排序”变量的第一个元素(即享受假期),然后搜索df1“ Original_items”变量的元素以找到完全匹配的元素。

找到匹配项后,我需要获取与df1'Original_items'中匹配的元素相关联的整行数据(即“享受假期。”,4,1,3),并将其附加到df2“重新排序”变量(即“享受假期”)。我需要在名为df_desired的新数据帧中输出此数据,该数据帧应为:“享受假期”,“享受假期”,4、1、3。请参见下面的示例图。

完成此操作后,我想对df2“重新排序”变量的每个元素重复此过程,因此最终结果看起来像下面的df_desired表。

问题的背景。我大约有2,000个项目,每个项目都有1,000个数据点。由于我需要以预定义的方式匹配项目并追加数据,因此我试图考虑一种有效的解决方案。

编辑 有人建议我可以简单地重命名“原始变量”中的项目。虽然这是事实,但对超过2,000个项目的数据帧进行操作很不方便。

此外,有人提到这个问题可能仅与合并有关。我认为这里仅需要在df1和df2中被标识为相同的元素进行合并。因此,存在两个关键问题:1)在这种特殊情况下如何匹配字符串变量? 2)如何有条件地合并/附加行,即是否已匹配。谢谢您的投入,谢谢您的帮助

我将提及到目前为止我尝试过并发现的内容。我意识到

 df1[,1] == df2 [,1] # gives me true or false if rows in column 1 are the 
                       same in both data frames. I tried to set up a double loop, but unsuccessfully   
 for (i in 1:nrow(df1)) {                                                 
      for (j in 1:nrow(df2)){
    if (i==j){
         c <- merge(a,b)        
        } else 
              print("no result")
           }
                 }  

我觉得在循环中,我无法指定仅使用df1中单个变量“ Original_item”中的行值

# df1 (4x4 matrix)
  Original_items        V2    V3   V4
  Love birds.            1     5    3
  Eat a lot of food.     2     5    5
  Love birthdays.        2     2    4
  Enjoy holidays.        4     1    3

# df2  (4x1 matrix)
  Reordered                   
  Enjoy holidays. 
  Eat a lot of food.
  Love birds. 
  Love birthdays.      

# df_desired (4x5 matrix)
  Reordered             Original_items            V2   V3   V4    
  Enjoy holidays.       Enjoy holidays.           4     1    3
  Eat a lot of food.    Eat a lot of food.        2     5    5 
  Love birds.           Love birds.               1     5    3
  Love birthdays.       Love birthdays.           2     2    4

1 个答案:

答案 0 :(得分:1)

如果我正确理解,您首先想对df1$original_items进行排序,使其顺序与df2重排序相同,然后将相同的排序模式应用于其余df1变量。 首先按照您希望df1的那些行结束的顺序来获取df1的索引向量。

#initialize an object to capture the above output
indices <- NULL
for (i in 1:nrow(df1)) {
    indices[i] <- which(df1$Original_items == df2$Reordered[i]))
}

然后,仅使用此索引列表对df1的所有行进行重新排序并创建新的df。

df_desired <- cbind(df2$Reordered, df1[indices, ])