Извлечь диапазон из нескольких строк в таблице и объединить в одну - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть таблица с данными раскопок.В нем перечислены элементы из функций и соответствующий диапазон дат.Вот так:

feature_id   object_type_id    amount    date_id    chronology
156          46                3          3          2300-2200
156          46                3          4          2200-2100
156          46                3          5          2100-2000
274          37                1          4          2200-2100
274          37                1          5          2100-2000

Как видите, таблица очень избыточна.Я хотел бы очистить его таким образом, чтобы дать мне только одну строку для каждого object_type_id на feature_id и заменить все хронологические проблемы и проблемы date_id на время начала и окончания.Например:

feature_id    object_type_id    amount   start_chronology    stop_chronology
156           46                3        2300                2000

Как мне это заархивировать?Я озадачен и потерян.

Ответы [ 2 ]

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

Предполагая per feature_id и object_type_id , рассмотрите возможность разделения хронология столбца по дефису в within, затем вызовите aggregate, где вы передаете два столбца взапустить две функции с окончательной очисткой столбца в конце.

# ASSIGN NEW COLS TO SPLIT chronology
df <- within(df, { 
              chronology <- as.character(chronology)
              start_chronology <- as.numeric(sapply(strsplit(chronology, '-'), `[`, 1))
              stop_chronology <- as.numeric(sapply(strsplit(chronology, '-'), `[`, 2))
              date_id <- NULL
              chronology <- NULL
      })
df
#   feature_id object_type_id amount start_chronology stop_chronology
# 1        156             46      3             2300            2200
# 2        156             46      3             2200            2100
# 3        156             46      3             2100            2000
# 4        274             37      1             2200            2100
# 5        274             37      1             2100            2000

# AGGREGATE TWO COLS ALONG TWO FCTS
agg_df <- do.call(data.frame,
                  aggregate(cbind(start_chronology, stop_chronology) ~ feature_id + object_type_id + amount, df, 
                            function(x) c(min=min(x), max=max(x)))
                  )

# REMOVE COLS AND RENAME COLS
agg_df <- setNames(transform(agg_df, start_chronology.min = NULL, stop_chronology.max=NULL), names(df))
agg_df

#   feature_id object_type_id amount start_chronology stop_chronology
# 1        274             37      1             2200            2000
# 2        156             46      3             2300            2000
0 голосов
/ 22 ноября 2018

Достаточно легко сделать с пакетом tidyverse :

df <- read.table(text = 'feature_id   object_type_id    amount    date_id    chronology
156          46                3          3          2300-2200
                 156          46                3          4          2200-2100
                 156          46                3          5          2100-2000
                 274          37                1          4          2200-2100
                 274          37                1          5          2100-2000', header = T)

library(tidyverse)

df.new <- df %>% 
  separate(chronology, c('start', 'end')) %>% 
  group_by(feature_id, object_type_id) %>% 
  summarize(
    amount = unique(amount),
    start_chronology = max(start),
    stop_chronology = min(end)
  )

  feature_id object_type_id amount start_chronology stop_chronology
       <int>          <int>  <int> <chr>            <chr>          
1        156             46      3 2300             2000           
2        274             37      1 2200             2000    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...