使用R中的查找表基于另一个df创建新列

时间:2018-08-04 18:40:57

标签: r

我很难理解如何做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_1team_id_2,它们使用查找数据框为给定的person_id查找相应的team_id,并采用该值。

这里正确的方法是什么?

3 个答案:

答案 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