Как получить строку и столбец значения, которые я ищу в другом фрейме данных в R - PullRequest
0 голосов
/ 01 марта 2020

У меня есть два с. Один выглядит следующим образом:

     114.5     113.5     112.5     111.5     
36.5 1493      1651      1696      1918    
35.5 1074      1336      1794      1891
33.5 358       549       609       815

, а другой выглядит так:

     elevation
1    1651
2    549
3    ... 

Теперь я хочу, чтобы мой новый был таким:

    elevation longitude    Latitude 
1    1651     113.5        36.5 
2    549      113.5        33.5     
3    ... 

Должен ли я пройти через него oop? Если да, то как и как я могу получить имена строк и столбцов, которые нужно присоединить, и изменить их на цифры c значения?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Один из вариантов - преобразовать в matrix, а затем использовать melt, чтобы вернуть 3 столбца data.frame, а затем задать для этого data.frame значение на основе значения во втором data.frame

library(reshape2)
out <- subset(melt(as.matrix(df1)), value %in% df2$elevation)[3:1]
names(out) <- c('elevation', 'longitude', 'Latitude')
out
#  elevation longitude Latitude
#4      1651     113.5     36.5
#6       549     113.5     33.5
* 1005. *

Или, если мы решим сделать это только с base R

out <- subset(as.data.frame.table(as.matrix(df1)), Freq %in% df2$elevation)[3:1]
names(out) <- c('elevation', 'longitude', 'Latitude')

data

df1 <- structure(list(`114.5` = c(1493L, 1074L, 358L), `113.5` = c(1651L, 
1336L, 549L), `112.5` = c(1696L, 1794L, 609L), `111.5` = c(1918L, 
1891L, 815L)), class = "data.frame", row.names = c("36.5", "35.5", 
"33.5"))

df2 <- structure(list(elevation = c(1651, 549)), class = "data.frame", 
    row.names = c(NA, 
-2L))
0 голосов
/ 02 марта 2020

Мы можем получить первый фрейм данных в длинном формате и затем выполнить соединение.

Используя tidyverse функции, это можно сделать так:

df1 %>%
  tibble::rownames_to_column('latitude') %>%
  tidyr::pivot_longer(cols = -latitude, values_to = 'elevation', 
                      names_to = 'longitude') %>%
  dplyr::right_join(df2, by = 'elevation')

#  latitude longitude elevation
#  <chr>    <chr>         <dbl>
#1 36.5     113.5          1651
#2 33.5     113.5           549
...