在匹配行时向 table 添加新信息

Adding new information to a table upon matching rows

我对 R 有非常基本的了解。我有两个选项卡(A 和 B),其中包含我要比较的行 - 有些值匹配,有些不匹配。如果是这种情况,我希望 R 找到匹配的元素并将文本值“E”添加到选项卡 A 中预先存在的行。

示例:

选项卡 A

   ID   Existing?
1  A   
2  B  
3  C   
4  D  
5  E 

选项卡 B

   ID
1  D   
2  B  
3  Y   
4  A  
5  W 

匹配时:

选项卡 A

   ID   Existing?
1  A       E
2  B       E
3  C   
4  D       E
5  E 

我在网上找到了有关如何匹配表格的信息,但 none 找到了有关如何在匹配发生时写入新信息的信息。

请像我 5 岁一样解释...我没有编程背景。

提前致谢!

使用 match 获取 df1$ID 中也存在于 df2$ID 中的元素,使用 ifelse 重新编码同时存在于 df1 中的值在 df2 中使用 "E",否则 NA

df1 <- data.frame(ID = LETTERS[1:5])
df2 <- data.frame(ID = c("D", "B", "Y", "A", "W"))

df1$Existing <- ifelse(match(df1$ID, df2$ID), "E", NA)

  ID Existing
1  A        E
2  B        E
3  C     <NA>
4  D        E
5  E     <NA>

另一种解决方案 - 使用 dplyr - 将连接两个数据框,您已将列 Existing 添加到要连接的数据框:

library(dplyr, warn.conflicts = FALSE)

df1 <- tibble(ID = LETTERS[1:5])
df2 <- tibble(ID = c("D", "B", "Y", "A", "W"))

df1 %>% 
  left_join(df2 %>% mutate(Existing = "E"))
#> Joining, by = "ID"
#> # A tibble: 5 x 2
#>   ID    Existing
#>   <chr> <chr>   
#> 1 A     E       
#> 2 B     E       
#> 3 C     <NA>    
#> 4 D     E       
#> 5 E     <NA>

这会将所有匹配的 ID 设置为 E,将所有 non-matching 设置为 NA

# data

tab1 <- structure(list(ID = c("A", "B", "C", "D", "E"), Existing = c(NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_)), class = "data.frame", row.names = c(NA,
-5L))

tab2 <- structure(list(ID = c("D", "B", "Y", "A", "W")), class = "data.frame", row.names = c(NA,
-5L))

给这只猫剥皮的方法有很多种。在 base-R 中,您可以尝试,例如

tab1$Existing[tab1$ID %in% tab2$ID] <- 'E'

实际上,对于比 6 行表更复杂的任何东西,您可以尝试 dplyr:

library(dplyr)
tab1 %>% mutate(Existing = ifelse(ID %in% tab2$ID, 'E',NA))

另一个有用的工具——语法略有不同——是data.table。

library(data.table)
setDT(tab1) -> tab1
setDT(tab2) -> tab2
tab1[,Existing := ifelse(tab1$ID %in% tab2$ID, 'E',NA)]

注意,这里mutate:=的作用大致相同。如果您更多地使用 R,您可能会对上述“方言”之一产生亲和力。

编辑:要删除行 NA 值(在 dplyr 中),您可以这样做:

    tab1 %>% mutate(Existing = ifelse(ID %in% tab2$ID, 'E',NA)) %>% 
filter(!is.na(Existing))

或piggy-backing @jpiversen 的解决方案:

df1 %>% 
  inner_join(df2 %>% mutate(Existing = "E"))