我很难理解如何做R中的查询表。我已经看到人们建议您应该使用“合并”来代替查询表,但是我不是确定正确的方法是:
假设我有以下内容:
set.seed(42)
person_ids <- data.frame(person_1_id = stringi::stri_rand_strings(100, 10, '[A-Z]'),
person_2_id = stringi::stri_rand_strings(100, 10, '[A-Z]'))
team_id_lookup <- data.frame(person_id = stringi::stri_rand_strings(100, 10, '[A-Z]'),
team_ids = floor(runif(100, min=0, max=500)))
我想在person_ids
中创建两个新列-team_id_1
和team_id_2
,它们使用查找数据框为给定的person_id查找相应的team_id,并采用该值。
这里正确的方法是什么?
答案 0 :(得分:3)
gdf_try=gpd.read_file(r'.\folder\gdf.shp')
gdf_try["int_column"]
0 2147483647
1 2147483647
2 2147483647
3 2147483647
4 2147483647
5 2147483647
6 2147483647
7 2147483647
8 2147483647
9 2147483647
只有在您的查找表中找到的人才会匹配。所有其他人将拥有set.seed(42)
person_ids <- data.frame(person_1_id = stringi::stri_rand_strings(10, 1, '[A-Z]'),
person_2_id = stringi::stri_rand_strings(10, 1, '[A-Z]'))
team_id_lookup <- data.frame(person_id = stringi::stri_rand_strings(5, 1, '[A-Z]'),
team_ids = floor(runif(5, min=0, max=500)))
library(dplyr)
person_ids %>%
left_join(team_id_lookup, by=c("person_1_id"="person_id")) %>%
left_join(team_id_lookup, by=c("person_2_id"="person_id")) %>%
rename(team_id_1 = team_ids.x,
team_id_2 = team_ids.y)
# person_1_id person_2_id team_id_1 team_id_2
# 1 X L 257 NA
# 2 Y S 223 NA
# 3 H Y NA 223
# 4 V G NA NA
# 5 Q M NA NA
# 6 N Y NA 223
# 7 T Z NA 452
# 8 D D 195 195
# 9 R M NA NA
# 10 S O NA NA
。
答案 1 :(得分:2)
只需在此处指出基本的R解决方案即可:
查找表的想法是,存在一个表,您可以在其中轻松地基于索引查找信息。 R中的索引将是例如表的行名,例如,您可以使用以下方式分配该行名:
rownames(team_id_lookup) <- team_id_lookup$person_id
然后您可以使用它来查找您的团队成员身份:
person_ids$team1 <- team_id_lookup[person_ids$person_1_id,"team_ids"]
person_ids$team2 <- team_id_lookup[person_ids$person_2_id,"team_ids"]
person_ids
person_1_id person_2_id team1 team2
1 X L 257 NA
2 Y S 223 NA
3 H Y NA 223
4 V G NA NA
5 Q M NA NA
6 N Y NA 223
7 T Z NA 452
8 D D 195 195
9 R M NA NA
10 S O NA NA
为了可重复性:我使用与@AntoniosK相同的数据,但根据Antonios的评论,将stringAsFactors设置为FALSE。
set.seed(42)
person_ids <- data.frame(
person_1_id = stringi::stri_rand_strings(10, 1, '[A-Z]'),
person_2_id = stringi::stri_rand_strings(10, 1, '[A-Z]'),
stringsAsFactors = F)
team_id_lookup <- data.frame(
person_id = stringi::stri_rand_strings(5, 1, '[A-Z]'),
team_ids = floor(runif(5, min=0, max=500)),
stringsAsFactors = F)
答案 2 :(得分:2)
我没有完全遵循只拥有100个团队值的逻辑,所以我正在做200个。但这是另一种方法。
set.seed(42)
person_ids <- data.frame(person_1_id = stringi::stri_rand_strings(100, 10, '[A-Z]'),
person_2_id = stringi::stri_rand_strings(100, 10, '[A-Z]'),
stringsAsFactors = FALSE)
all_pid <- c(person_ids$person_1_id, person_ids$person_2_id)
team_ids <- floor(runif(200, min=0, max=500))
names(team_ids) <- all_pid
person_ids$team_id_1 <- team_ids[person_ids$person_1_id]
person_ids$team_id_2 <- team_ids[person_ids$person_2_id]
head(person_ids)
person_1_id person_2_id team_id_1 team_id_2
1 XYHVQNTDRS WBVOMAOSGV 128 207
2 LSYGMYZDMO KODFEVCGUH 362 422
3 XDZYCNKXLV WBIIDJMBZX 78 428
4 TVKRAVAFXP ZEBDJOYQMC 157 225
5 JLAZLYXQZQ YJJQSFPVZA 148 366
6 IJKUBTREGN VFCRHVQNAH 339 337