我正在尝试在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(反之亦然),那么我想过滤掉它。
有可能做到这一切吗?是否可以将它全部绑定到一个函数中?如果是这样,怎么样?
感谢任何可以提供帮助的人!
答案 0 :(得分:1)
正如我们在评论中所讨论的那样,dplyr::inner_join()
似乎可以满足您的需求。来自文档:
inner_join
返回x
中y
匹配值以及x
和y
中所有列的所有行。如果x
和y
之间存在多个匹配项,则会返回所有匹配项的组合。
因此,您可以尝试使用您的数据:
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)
调用。