gpt4 book ai didi

r - 从 r 中的另一个数据框中查找值

转载 作者:行者123 更新时间:2023-12-05 04:05:23 24 4
gpt4 key购买 nike

我有一个名为 df 的大型数据框,其中包含一些 ID。

我有另一个数据框 (id_list),其中包含一组匹配的 ID 及其与每个 ID 的关联特征。 ID 在两个数据框中的顺序不一致。

实际上,我想从较大的数据框 df 查找到 id_list 并添加两列,即 DisplayType 到当前数据帧 df

有很多令人困惑的例子。这样做最有效的方法是什么。我尝试使用 match()%in% 并惨遭失败。

这是一个可重现的例子。

df <- data.frame(Feats = matrix(rnorm(20), nrow = 20, ncol = 5), ID = sample.int(10, 10))

id_list <- data.frame(ID = sample.int(10,10),
Display = sample(c('clear', 'blur'), 20, replace = TRUE),
Type = sample(c('red', 'green', 'blue', 'indigo', 'yellow'), 20, replace = TRUE))

Feats.1 Feats.2 Feats.3 Feats.4 Feats.5 ID
1 3.14944573 -0.52285062 3.14944573 -0.52285062 3.14944573 2
2 -0.41096007 0.38256691 -0.41096007 0.38256691 -0.41096007 1
3 0.03629351 -0.02514005 0.03629351 -0.02514005 0.03629351 7
4 0.91257290 1.35590761 0.91257290 1.35590761 0.91257290 5
5 -0.26927311 -2.10213773 -0.26927311 -2.10213773 -0.26927311 3
6 3.14944573 -0.52285062 3.14944573 -0.52285062 3.14944573 4
7 -0.41096007 0.38256691 -0.41096007 0.38256691 -0.41096007 10
8 0.03629351 -0.02514005 0.03629351 -0.02514005 0.03629351 6
9 0.91257290 1.35590761 0.91257290 1.35590761 0.91257290 8
10 -0.26927311 -2.10213773 -0.26927311 -2.10213773 -0.26927311 9

ID Display Type
1 6 clear indigo
2 1 blur blue
3 7 clear red
4 4 clear red
5 3 blur red
6 10 clear yellow
7 2 clear blue
8 8 blur green
9 5 clear blue
10 9 clear green

生成的结束 df 的大小应为 [20 x 8]。

最佳答案

您可以使用 base R 中的 mergedplyr 中的 left_join 来轻松完成此操作。 (还有 data.table::merge,也许其他人可以给出答案。)您可能想采取措施确保您不会丢失任何数据,如果您的在查找中没有相应 ID 的数据框。如果不是这种情况,您可以在 merge 中将 all.x 更改为 false 或 null,或者将 left_join 切换为 inner_join。为了说明,我向数据中添加了一个虚拟行,其 ID 在查找表中不存在。

df <- data.frame(Feats = matrix(rnorm(10), nrow = 5, ncol = 5), ID = sample.int(10, 10))
dummy <- df[1, ]
dummy$ID <- 12
df <- rbind(dummy, df)

id_list <- data.frame(ID = sample.int(10,10),
Display = sample(c('clear', 'blur'), 10, replace = TRUE),
Type = sample(c('red', 'green', 'blue', 'indigo', 'yellow'), 10, replace = TRUE))

使用 merge,您可以将 by 设置为要连接的两个数据框中的列名,或者将 by.xby.y 如果他们有不同的名字。 all.x = T 会将所有观察结果保留在第一个数据框中,即使它们与第二个数据框中的观察结果不匹配也是如此。

merged1 <- merge(df, id_list, by = "ID", sort = F, all.x = T)
merged1
#> ID Feats.1 Feats.2 Feats.3 Feats.4 Feats.5 Display
#> 1 10 -1.44053344 1.0086988 -1.44053344 1.0086988 -1.44053344 clear
#> 2 5 0.99220217 -0.3125813 0.99220217 -0.3125813 0.99220217 clear
#> 3 2 1.03881289 1.1277627 1.03881289 1.1277627 1.03881289 clear
#> 4 7 -0.01678186 -0.1519029 -0.01678186 -0.1519029 -0.01678186 clear
#> 5 4 0.07130125 1.1715833 0.07130125 1.1715833 0.07130125 clear
#> 6 6 -1.44053344 1.0086988 -1.44053344 1.0086988 -1.44053344 clear
#> 7 8 0.99220217 -0.3125813 0.99220217 -0.3125813 0.99220217 blur
#> 8 3 1.03881289 1.1277627 1.03881289 1.1277627 1.03881289 clear
#> 9 1 -0.01678186 -0.1519029 -0.01678186 -0.1519029 -0.01678186 clear
#> 10 9 0.07130125 1.1715833 0.07130125 1.1715833 0.07130125 clear
#> 11 12 -1.44053344 1.0086988 -1.44053344 1.0086988 -1.44053344 <NA>
#> Type
#> 1 indigo
#> 2 yellow
#> 3 blue
#> 4 indigo
#> 5 yellow
#> 6 indigo
#> 7 green
#> 8 red
#> 9 red
#> 10 blue
#> 11 <NA>

dplyr::left_join 保留来自第一个数据框的所有观察结果,并合并来自第二个数据框的任何匹配数据。

joined <- dplyr::left_join(df, id_list, by = "ID")
head(joined)
#> Feats.1 Feats.2 Feats.3 Feats.4 Feats.5 ID Display
#> 1 -1.44053344 1.0086988 -1.44053344 1.0086988 -1.44053344 12 <NA>
#> 2 -1.44053344 1.0086988 -1.44053344 1.0086988 -1.44053344 10 clear
#> 3 0.99220217 -0.3125813 0.99220217 -0.3125813 0.99220217 5 clear
#> 4 1.03881289 1.1277627 1.03881289 1.1277627 1.03881289 2 clear
#> 5 -0.01678186 -0.1519029 -0.01678186 -0.1519029 -0.01678186 7 clear
#> 6 0.07130125 1.1715833 0.07130125 1.1715833 0.07130125 4 clear
#> Type
#> 1 <NA>
#> 2 indigo
#> 3 yellow
#> 4 blue
#> 5 indigo
#> 6 yellow

reprex package 创建于 2018-07-13 (v0.2.0).

关于r - 从 r 中的另一个数据框中查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51328147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com