Как извлечь строки фрейма данных между двумя символами - PullRequest
0 голосов
/ 24 августа 2018

У меня есть плохо структурированные данные, которые я пытаюсь очистить. У меня есть список ключевых слов, которые я могу использовать для извлечения фреймов данных из файла CSV. Мои необработанные данные структурированы примерно следующим образом: Имеется 7 столбцов со значениями, первые столбцы являются строковыми идентификаторами, такими как кредитный рейтинг или символ страны (для данных FX), тогда как остальные 6 столбцов являются либо заголовками, подобными строке процентного изменения (например, + 10%), либо просто числовое значение. Поскольку все эти данные объединены, я хочу иметь возможность извлекать данные для каждой категории. Так, например, я хотел бы извлечь все строки между моим ключевым словом "credit" и моим ключевым словом "FX" в моем первом столбце. Есть ли способ сделать это легко в base R или dplyr?

например.

df %>%
    filter(column1 = in_between("credit", "FX"))

Пример кадра данных:

row 1: c('random',-1%', '0%', '1%, '2%')
row 2: c('credit', NA, NA, NA, NA)
row 3: c('AAA', 1,2,3,4)
...
row n: c('FX', '-1%', '0%', '1%, '2%')

И я бы хотел следующий вывод:

row 1: c('credit', -1%', '0%', '1%, '2%')
row 2: c('AAA', 1,2,3,4)
...
row n-1: ...

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Используя то, что предложил Брайан:

in_between <- function(df, start, end){
    return(df[start:(end-1),])
}

Затем зациклите индексы в

dividers = which(df$column1 %in% keywords == TRUE)

и сохраните выходные данные функции так, как хотелось бы.

lapply(1:(length(dividers)-1), function(x) in_between(df, start = dividers[x], end = dividers[x+1]))

Это работает.Грязные данные, поэтому у меня все еще есть раздражающий случай, когда мне нужно сохранить смещенные строки.

0 голосов
/ 24 августа 2018

Я все еще не уверен на 100%, чего вы пытаетесь достичь, но делает ли это то, что вам нужно?

set.seed(1)
df <- data.frame(
  x = sample(LETTERS[1:10]),
  y = rnorm(10),
  z = runif(10)
)

start <- c("C", "E", "F")

df2 <- df %>% 
  mutate(start = x %in% start,
         group = cumsum(start))

split(df2, df2$group)
0 голосов
/ 24 августа 2018

Если я правильно понимаю, вы могли бы сделать что-то вроде

start <- which(df$column1 == "credit")
end   <- which(df$column1 == "FX")
df[start:(end-1), ]

Конечно, это не сработает, если в столбце «кредит» или «FX» более одного раза.

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