如何在第一个数据帧中添加第三列,并将值放在第二个数据帧的某些列中,其ID与第一个DF中的ID匹配?

时间:2017-05-03 00:21:42

标签: r dataframe

我有以下数据框df1df2(真正的数据框有大约一百万行):

df1 <- data.frame(ID=c(23425, 84733, 49822, 39940), X=c(312,354,765,432))
df2 <- data.frame(ID=c(23425, 49822), Y=c(111,222))

我想在dataFrame df1中添加一个额外的列Z.每次来自df1的ID与来自df2的某个ID匹配时,必须将相应的Y值添加到该第三行。如果没有匹配,则必须添加零

结果必须是这个:

df <- data.frame(ID=c(23425,84733, 49822, 39940), X=c(312,354,765,432), Z=c(111,0,222,0))

我将第二个数据帧中的ID存储在一个向量中并使用了一个循环,但它需要永远。

3 个答案:

答案 0 :(得分:2)

我相信你想要的是一个加入:

library(dplyr)

df1 %>% 
    left_join(df2)

#> Joining, by = "ID"
#> # A tibble: 4 × 3
#>      ID     X     Y
#>   <dbl> <dbl> <dbl>
#> 1 23425   312   111
#> 2 84733   354    NA
#> 3 49822   765   222
#> 4 39940   432    NA

如果您想要的方式与新列名称完全相同而不是NA,则可以添加更多行:

library(tidyr)
df1 %>%
    left_join(df2) %>%
    rename(Z = Y) %>%
    replace_na(replace = list(Z = 0))

#> Joining, by = "ID"
#> # A tibble: 4 × 3
#>      ID     X     Z
#>   <dbl> <dbl> <dbl>
#> 1 23425   312   111
#> 2 84733   354     0
#> 3 49822   765   222
#> 4 39940   432     0

答案 1 :(得分:1)

我们可以使用data.table进行连接,并将NA替换为0

library(data.table)
setDT(df1)[df2, Z := Y, on = .(ID)][is.na(Z), Z:= 0]
df1
#     ID   X   Z
#1: 23425 312 111
#2: 84733 354   0
#3: 49822 765 222
#4: 39940 432   0

答案 2 :(得分:0)

您只需使用合并即可完成此操作。合并将匹配df2中的Y值&#34; ID&#34;到df1。如果指定&#34; all = TRUE&#34;参数,当df1中的ID未找到df2匹配时,Y值将为NA。

按ID合并2个数据集,并保留每个数据集中的所有值。

  

df&lt; - merge(df1,df2,by =&#34; ID&#34;,all = TRUE)   DF        ID X Y.   1 23425 312 111   2 39940 432 NA   3 49822 765 222   4 84733 354 NA

如果您希望不将匹配指定为0而不是NA,则只需替换Y列中的该值。

  

df $ Y&lt; - ifelse(is.na(df $ Y),0,df $ Y)   DF        ID X Y.   1 23425 312 111   2 39940 432 0   3 49822 765 222   4 84733 354 0