если еще где ячейка содержится в строке имени столбца - PullRequest
0 голосов
/ 14 ноября 2018

Трудно было решить эту проблему.Так эффективно я пытаюсь выбрать ячейку в широком фрейме данных, где значения в одном столбце содержатся в строке имени столбца.Я обычно использую тидиверс в своих рабочих процессах и не могу заставить что-либо в этом стихе работать.Пробовал применять, для циклического прохождения рядов.Есть некоторые вещи, чтобы работать, но они очень медленные.Прикрепленный фрагмент фрейма данных - это только первые 10 строк фрейма данных с 1,8 миллионами строк.Так что использование tidy::gather здесь не может быть и речи.Любые мысли о том, как я мог бы выполнить это, были бы очень полезны, потому что это происходит намного чаще, чем я ожидал.

Данные можно найти здесь

library(tidyverse)
library(foreach)

df <- read_csv('test_data.csv')

enter image description here

Итак, здесь я пытаюсь найти переменную для fire_year, которая содержится в широких полях var_.Так, например, здесь, если fire_year = 1998, я бы хотел зафиксировать значение в столбце с именем var_1998.Это самое близкое мне решение для получения решения (и оно работает!), Но для полного кадра данных это навсегда:

df_slim <- foreach(df=iter(df, by='row'), .combine=rbind, 
                  .packages = c('dplyr', "tidyverse")) %do% {
                    df_out <- df %>%
                      gather(key = key, value = out_var, -fpa_id, -fire_year) %>%
                      separate(key,
                               into = c("tmp1", 'zyear'),
                               sep = "_") %>%
                      mutate(var = ifelse(fire_year == zyear, out_var, NA)) %>%
                      na.omit() %>%
                      dplyr::select(fpa_id, fire_year, var)
                    return(df_out)
                  }

enter image description here

Я не могу придумать быстрый, эффективный способ достичь своей жизни!На данный момент я подсчитал, что это займет 160 часов для завершения цикла for во фрейме данных с 1,7 миллионами строк!Если бы кто-то мог указать мне правильное направление, я был бы вечно благодарен!

Спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Я не уверен на 100%, что вам нужно, но вот мое мнение (с использованием data.table)

library(data.table)

    dt <- data.table(test_data)

    setkey(dt, "fire_year")
    for(i in unique(dt[["fire_year"]])){
      dt[fire_year == i, var:= get(paste("var", i, sep = "_"))]
    }

А затем укажите нужные вам cols

dt_slim <- dt[,.SD, .SDcols = c("fpa_id", "fire_year", "var")]
dt_slim

        fpa_id fire_year var
 1: FS-1418827      2004   0
 2: FS-1418835      2004   9
 3: FS-1418845      2004   0
 4: FS-1418847      2004   0
 5: FS-1418849      2004   0
 6: FS-1418851      2004   0
 7: FS-1418859      2004   0
 8: FS-1418826      2005   0
 9: FS-1418854      2005   0
10: FS-1418856      2005 114

Не проверено на ваших 1,8 миллиона строк. Должно быть относительно быстро. Хотя интересно время ...

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