我有以下数据框df1
和df2
(真正的数据框有大约一百万行):
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存储在一个向量中并使用了一个循环,但它需要永远。
答案 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。
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
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