如何在R中运行有条件的函数并包含其他函数

时间:2016-07-11 10:23:32

标签: r

我正在尝试在R中编写一个可以同时执行一些操作的函数,我认为该函数必须使两个数据帧起作用。

previous question中,我询问了如何将数据框中的行添加到另一个中。我最终使用此代码来执行此操作,如其中一个答案所示:

MissingFromC1 <- anti_join(C2, C1, by = c("HW", "Var"))
MissingFromC1$Freq <- 0
All_c1 <- full_join(C1, MissingFr1, by = c("HW", "Var", "Freq"))

其中C1和C2是由三列组成的两个数据帧:HW,Var和Freq。每个HW具有多种不同的频率。它们看起来像这样:

            C1                                               C2    
Headword   Spelling   Freq                    Headword     Spelling   Freq
 Word1       Sp1a      x                        Word1         Sp1a      x
 Word1       Sp1b      x                        Word1         Sp1c      x
 Word1       Sp1d      x                        Word2         Sp2a      x
 Word2       Sp2a      x                        Word2         Sp2b      x     
 Word3       Sp1a      x                        

C1和C2不相同 - 每个包括HW和Var,它们不在另一个中。我想确保两者的长度相同,因此上面的代码会添加从C2到C1的缺失行(然后我再次运行它,但在另一个数据框上)。

我现在要做的是把它变成一个功能。但是有了改变 - 我只想加入HW中缺少Var的行。我不想将新硬件添加到C1或C2,只是缺少Var。实际上,例如,如果HW在C1但不在C2中,那么我想过滤掉 - 即在上面的例子中,Word3在C1中但C2中根本没有Word3 Vars,所以我想喜欢完全过滤掉。 (我想比较每个HW的Var比率,但是如果我有任何由Var组成的HW都具有Freq = 0,那么这将不起作用)。我希望这是有道理的!

我开始为它编写代码,只是为了尝试显示我正在尝试做的事情(我意识到这段代码非常错误!我只是觉得它可能会有所帮助)。

add.missing.to.df1 <- function(df1, df2) {
if(is.element(df2$HW, df1$HW))) 
  missing.val <- anti_join(df2, df1, by = c("HW", "Var"))
  missing.val$Fr <- 0
  All_df2 <- full_join(df1, miss.val, by = c("HW", "Var", "Fr"))
  df2_fin <- filter(All_df2, if(!is.element(df2$HW, df1$HW)))
  } 

所以最后,我希望有两个数据帧。每个包括在两个数据帧中至少有一个Var的HW。如果HW在C1但不在C2(反之亦然),那么我想过滤掉它。

有可能做到这一切吗?是否可以将它全部绑定到一个函数中?如果是这样,怎么样?

感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分:1)

正如我们在评论中所讨论的那样,dplyr::inner_join()似乎可以满足您的需求。来自文档:

  

inner_join返回xy匹配值以及xy中所有列的所有行。如果xy之间存在多个匹配项,则会返回所有匹配项的组合。

因此,您可以尝试使用您的数据:

library("dplyr")
df <- inner_join(C1, C2, by = c("Headword", "Spelling"))
df
#   Headword Spelling Freq.x Freq.y
# 1    Word1     Sp1a      1      1
# 2    Word2     Sp2a      4      3

关于在函数中调用两个数据帧的原始问题,这只是通过以下方式完成的:

my_function <- function(df1, df2, ...) {
  # do some stuff here
}

然后使用my_function(df1, df2)调用。