juntar informações de dois dataframes R
Oct 26 2020
Eu gostaria de juntar dois dataframes com R aqui, o primeiro
resno resid elety eleno
1 ILE C 3
1 ILE O 4
2 VAL C 11
2 VAL O 12
3 GLY C 18
3 GLY O 19
o segundo
C.O dist
12-18 3.112819
27-37 2.982788
51-63 3.185184
52-62 2.771583
63-69 3.157737
70-80 2.956738
então vamos explicar o que eu preciso. Olhando para o segundo dataframe, eu tenho a distância ("dist") entre os pontos 12-18, correspondendo a "eleno" no primeiro dataframe. para estes 2 pontos também tenho "resno" que é o que me interessa, porque gostaria de obter algo assim
resno resid elety eleno rescoup dist
1 ILE C 3 - -
1 ILE O 4 - -
2 VAL C 11 - -
2 VAL O 12 2-3 3.112819
3 GLY C 18 2-3 3.112819
3 GLY O 19 - -
Como eu posso fazer? isso é possível com R?
obrigado!
Respostas
1 RonakShah Oct 26 2020 at 11:29
Você pode primeiro criar um dataframe longo de df2onde cada número C.Oé uma linha única.
library(dplyr)
library(tidyr)
df3 <- df2 %>%
separate(C.O, c('col1', 'col2'), sep = '-', convert = TRUE) %>%
mutate(eleno = purrr::map2(col1, col2, seq), .before = 1,
row = row_number()) %>%
select(-col1, -col2) %>%
unnest(eleno)
df3
# A tibble: 60 x 3
# eleno row dist
# <int> <int> <dbl>
# 1 12 1 3.11
# 2 13 1 3.11
# 3 14 1 3.11
# 4 15 1 3.11
# 5 16 1 3.11
# 6 17 1 3.11
# 7 18 1 3.11
# 8 27 2 2.98
# 9 28 2 2.98
#10 29 2 2.98
# … with 50 more rows
Junte-se a este dataframe com valores df1e paste resnopara criar rescoup.
df1 %>%
left_join(df3, by = 'eleno') %>%
group_by(row) %>%
mutate(rescoup = paste(resno, collapse = '-'),
rescoup = replace(rescoup, is.na(dist), NA)) %>%
ungroup() %>%
select(-row)
# resno resid elety eleno dist rescoup
# <int> <chr> <chr> <int> <dbl> <chr>
#1 1 ILE C 3 NA NA
#2 1 ILE O 4 NA NA
#3 2 VAL C 11 NA NA
#4 2 VAL O 12 3.11 2-3
#5 3 GLY C 18 3.11 2-3
#6 3 GLY O 19 NA NA
zx8754 Oct 26 2020 at 11:45
Usando data.table , divida e mescle:
library(data.table)
merge(d1,
d2[, lapply(.SD, function(x) unlist(tstrsplit(x, "-", fixed = TRUE,
type.convert = TRUE)))],
by.x = "eleno", by.y = "C.O", all.x = TRUE)
# eleno resno resid elety dist
# 1: 3 1 ILE C NA
# 2: 4 1 ILE O NA
# 3: 11 2 VAL C NA
# 4: 12 2 VAL O 3.112819
# 5: 18 3 GLY C 3.112819
# 6: 19 3 GLY O NA
Dados de exemplo:
d1 <- fread("resno resid elety eleno
1 ILE C 3
1 ILE O 4
2 VAL C 11
2 VAL O 12
3 GLY C 18
3 GLY O 19")
d2 <- fread("C.O dist
12-18 3.112819
27-37 2.982788
51-63 3.185184
52-62 2.771583
63-69 3.157737
70-80 2.956738")
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?