我有两个共享一个公共列(名为sys_loc_code)的数据帧。第一个数据帧(df1)有1033行。第二个数据帧(df2)有2751.
我想组合df1和df2,所以得到一个新的数据帧,其中df1和df2中的所有列只保留df1中的行。
我尝试了join
,left_join
和inner_join
(来自dplyr
)和一个简单的merge
。每个都返回2057行,我认为它应该只返回1033以匹配df1
中的内容。如何仅返回df1中的行?
我无法共享导致此问题的数据集。但是,经过一些咨询后,我可以用这个最小的例子重新创建问题:
df1 <-
data.frame(
sys_loc_code = c("A", "B", "C")
, df1Val = 1
)
df2 <-
data.frame(
sys_loc_code = c("A", "B", "B", "C", "D")
, df2Val = c(1, 1, 2, 1, 1)
)
left_join(df1, df2)
返回4行,而df1
只有3行。
答案 0 :(得分:0)
最大问题是df2$sys_loc_code
包含df1$sys_loc_code
中某些值的多个条目。
df1$sys_loc_code
只有3个值,但其中一个(“B”)在df2$sys_loc_code
中出现两次,这意味着这些合并将返回4行。 e.g。
left_join(df1, df2)
给出
sys_loc_code df1Val df2Val
1 A 1 1
2 B 1 1
3 B 1 2
4 C 1 1
因此,对您的问题的简短回答可能是根据您编写的代码,结果实际上是“正确的”。如果您想要发生不同的事情(例如,每场比赛只有df2
只有一个条目),您可能需要准确确定所需的输出。
例如,如果您想要df2
的第一个条目:
left_join(
df1
, df2 %>%
group_by(sys_loc_code) %>%
slice(1)
)
给出
sys_loc_code df1Val df2Val
1 A 1 1
2 B 1 1
3 C 1 1
left_join(
df1
, df2 %>%
group_by(sys_loc_code) %>%
summarise(df2Val = mean(df2Val))
)
给出
sys_loc_code df1Val df2Val
1 A 1 1.0
2 B 1 1.5
3 C 1 1.0
和
left_join(
df1
, df2 %>%
mutate(aVarToSortOn = 1:n()) %>%
group_by(sys_loc_code) %>%
slice(which.max(aVarToSortOn))
)
给出
sys_loc_code df1Val df2Val aVarToSortOn
1 A 1 1 1
2 B 1 2 3
3 C 1 1 4
如果您知道列中包含唯一值,则还可以使用filter
选择要保留的匹配项df2