在匹配行时向 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"))
我对 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"))