Фильтр цикла данных, сохраняющий все вхождения в одном экземпляре - PullRequest
0 голосов
/ 09 мая 2019

Я выполняю подсчет данных в цикле для выполнения некоторых вычислений.На первой итерации я хочу сохранить весь фрейм данных.Я не могу сделать это с кодом, который я написал, и весь фрейм данных исчезает.

Игрушечный пример

data <- data.frame(letters=c("a","b","c"))
for (j in 1:3){
    cols <- c(".*","a","b")
    df <- data %>% filter(letters %in% cols[j])
    write.csv(df,paste("result_",j,".csv", sep = ""), row.names = F)
}

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Если вы хотите использовать регулярные выражения, вы можете использовать grepl вместо %in%

data <- data.frame(letters=c("a","b","c"))
cols <- paste0('^', c(".*","a","b"), '$')
for (j in 1:3){
    df <- data %>% filter(grepl(cols[j], letters))
    # write.csv(df,paste("result_",j,".csv", sep = ""), row.names = F)
    print(df)
}

Поскольку вы уже используете один пакет tidyverse (dplyr), вас может заинтересовать альтернатива tidyverse этому циклу, используя purrr::iwalk

library(purrr)

iwalk(cols, ~{
  df <- data %>% filter(grepl(.x, letters))
  write.csv(df, paste("result_", .y, ".csv", sep = ""), row.names = F)
})
0 голосов
/ 09 мая 2019

Другое решение:


library(tidyverse)
#> Registered S3 methods overwritten by 'ggplot2':
#>   method         from 
#>   [.quosures     rlang
#>   c.quosures     rlang
#>   print.quosures rlang
#> Registered S3 method overwritten by 'rvest':
#>   method            from
#>   read_xml.response xml2

data <- data.frame(letters=c("a","b","c"))

f <- c("^.","^a","^b")

map(f, ~filter(data, str_detect(letters, .x)))
#> [[1]]
#>   letters
#> 1       a
#> 2       b
#> 3       c
#> 
#> [[2]]
#>   letters
#> 1       a
#> 
#> [[3]]
#>   letters
#> 1       b

Создано в 2019-05-09 пакетом представ. (v0.2.1)

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