比较具有不同行长的两个不同数据帧的两列,返回第三行

时间:2020-03-15 12:22:52

标签: r dataframe foreach compare conditional-statements

我有两个不同的df,它们具有相同的列:“ O”代表位置,“ date”代表时间。 Df 1在一个1行中为某个位置(O)和时间(日期)提供了不同的信息,而df 2在同一年和同一行中的许多不同行中提供了许多信息。不,如果“ O”和“ date”的值相等,我想提取一个适用于第二个df的所有行的第一个df的条件。

为了更清楚一点: 我在df 1中有一行:O = 1002和date = 1885的krnqm = 250。现在,我想要df 2中的新列“ krnqm”,其中df2 $ 0 = 1002和df2 $ date = 1885的所有行的df2 $ krnqm = 250。

不幸的是,我不知道如何将该条件放入代码行,这将非常有助于您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用合并功能在base R中非常轻松地执行此操作。这是一个例子。

从描述中模拟一些数据:

df1 <- expand.grid(O = letters[c(2:4,7)], date = c(1,3))
df2 <- data.frame(O = rep(letters[1:6], c(2,3,3,6,2,2)), date = rep(1:3, c(3,2,4)))
df1$krnqm <- sample(1:1000, size = nrow(df1), replace=T)

> df1
  O date krnqm
1 b    1   833
2 c    1   219
3 d    1   773
4 g    1   514
5 b    3   118
6 c    3   969
7 d    3   704
8 g    3   914
> df2
   O date
1  a    1
2  a    1
3  b    1
4  b    2
5  b    2
6  c    3
7  c    3
8  c    3
9  d    3
10 d    1
11 d    1
12 d    1
13 d    2
14 d    2
15 e    3
16 e    3
17 f    3
18 f    3

现在,让我们以您描述的方式组合两个数据帧。

df2 <- merge(df2, df1, all.x=T)
> df2
   O date krnqm
1  a    1    NA
2  a    1    NA
3  b    1   833
4  b    2    NA
5  b    2    NA
6  c    3   969
7  c    3   969
8  c    3   969
9  d    1   773
10 d    1   773
11 d    1   773
12 d    2    NA
13 d    2    NA
14 d    3   704
15 e    3    NA
16 e    3    NA
17 f    3    NA
18 f    3    NA

因此,您可以看到,结果数据帧中的krnqm列包含NA,其中没有从中提取krnqm值的数据帧中找到的'O'和'date'的任何组合。如果您的df1还有其他列,您不想将其包括在合并中,只需稍微更改合并调用即可仅使用您想要的那些列:df2 <- merge(df2, df1[,c("O", "date", "krnqm")], all.x=T)

祝你好运!