dplyr мутировать последовательность из двух столбцов - PullRequest
1 голос
/ 09 февраля 2020

У меня есть несколько списков, которые я хочу «расширить» и взяв последовательности. Данные выглядят так:

[[10]]
  minX maxX minY maxY
1  4.9  7.9  4.9  7.9

[[11]]
  minX maxX minY maxY
1    2  3.8    2  3.8

[[12]]
  minX maxX minY maxY
1    3  6.9    3  6.9

Я хотел бы создать что-то вроде:

x <- var_lists[[1]]
seq(x[1,1], x[1, 2], length.out= 100)

, но по имени, что-то вроде seq(x["minX"], x["maxX"], length.out= 100), так как я также хочу сделать это для minY и maxY столбцов.

Таким образом, я получу два новых столбца, которые представляют собой последовательности от minX до maxX и minY до maxY.

Я работаю в трубе dplyr, поэтому я хотел бы сделать это, используя mutate или некоторую функцию tidyverse.

Данные:

var_lists <- list(structure(list(minX = 2, maxX = 3.8, minY = 2, maxY = 3.8), row.names = c(NA, 
-1L), class = "data.frame"), structure(list(minX = 3, maxX = 6.9, 
    minY = 3, maxY = 6.9), row.names = c(NA, -1L), class = "data.frame"), 
    structure(list(minX = 1, maxX = 2.5, minY = 1, maxY = 2.5), row.names = c(NA, 
    -1L), class = "data.frame"), structure(list(minX = 4.9, maxX = 7.9, 
        minY = 4.9, maxY = 7.9), row.names = c(NA, -1L), class = "data.frame"), 
    structure(list(minX = 3, maxX = 6.9, minY = 3, maxY = 6.9), row.names = c(NA, 
    -1L), class = "data.frame"), structure(list(minX = 1, maxX = 2.5, 
        minY = 1, maxY = 2.5), row.names = c(NA, -1L), class = "data.frame"), 
    structure(list(minX = 4.9, maxX = 7.9, minY = 4.9, maxY = 7.9), row.names = c(NA, 
    -1L), class = "data.frame"), structure(list(minX = 2, maxX = 3.8, 
        minY = 2, maxY = 3.8), row.names = c(NA, -1L), class = "data.frame"), 
    structure(list(minX = 1, maxX = 2.5, minY = 1, maxY = 2.5), row.names = c(NA, 
    -1L), class = "data.frame"), structure(list(minX = 4.9, maxX = 7.9, 
        minY = 4.9, maxY = 7.9), row.names = c(NA, -1L), class = "data.frame"), 
    structure(list(minX = 2, maxX = 3.8, minY = 2, maxY = 3.8), row.names = c(NA, 
    -1L), class = "data.frame"), structure(list(minX = 3, maxX = 6.9, 
        minY = 3, maxY = 6.9), row.names = c(NA, -1L), class = "data.frame"))

1 Ответ

1 голос
/ 09 февраля 2020

Мы можем использовать map до l oop над list, извлечь столбец из одной строки с помощью $ и применить seq

library(purrr)
map_dfr(var_lists, ~ tibble(x = seq(.x$minX, .x$maxX, length.out = 100),
               y = seq(.x$minY, .x$maxY, length.out = 100)), .id = 'grp')
# A tibble: 1,200 x 3
#       x     y grp  
#   <dbl> <dbl> <chr>
# 1  2     2    1    
# 2  2.02  2.02 1    
# 3  2.04  2.04 1    
# 4  2.05  2.05 1    
# 5  2.07  2.07 1    
# 6  2.09  2.09 1    
# 7  2.11  2.11 1    
# 8  2.13  2.13 1    
# 9  2.15  2.15 1    
#10  2.16  2.16 1    
# … with 1,190 more rows

Если их много столбцы ('X', 'Y', 'Z', ...), другой вариант - преобразовать в «длинный» формат с помощью pivot_longer, а затем применить ко всем столбцам

library(dplyr)
library(tidyr)
map_dfr(var_lists,  ~ 
           .x %>%
             pivot_longer(cols = everything(), names_to = c("group", ".value"),
      names_sep = "(?<=[a-z])(?=[A-Z])") %>% 
      summarise_at(-1, ~ seq(.[1], .[2], length.out = 100)), .id = 'grp') %>%
      as_tibble
# A tibble: 1,200 x 3
#       X     Y grp  
#   <dbl> <dbl> <chr>
# 1  2     2    1    
# 2  2.02  2.02 1    
# 3  2.04  2.04 1    
# 4  2.05  2.05 1    
# 5  2.07  2.07 1    
# 6  2.09  2.09 1    
# 7  2.11  2.11 1    
# 8  2.13  2.13 1    
# 9  2.15  2.15 1    
#10  2.16  2.16 1    
# … with 1,190 more rows

ПРИМЕЧАНИЕ. : Если нам нужно сохранить его как list, замените map_dfr на map суффикс _dfr, предлагающий возвратить одну привязку строки data.frame, т.е. если это _dfc, это будет столбец привязывать. Во втором решении, если это заменить на map, то %>% as_tibble также следует удалить, так как он ожидал один data.frame от предыдущего шага

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...