Написание разных файлов .csv на основе разных комбинаций значений и столбцов в R - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу записать различные файлы .csv, основанные на комбинации значений и столбцов. Пример таблицы tbl можно найти ниже:

# libs 
library(tidyverse)
library(data.table) 

# tbl
tbl <- tibble(
  Record = 1:100,
  B1     = c(rep("B1", 10), rep(NA, 90)),
  B2     = c(rep("B2", 20), rep(NA, 80)),
  B3     = c(rep("B3", 40), rep(NA, 60)),
  B4     = c(rep("B4", 70), rep(NA, 30)),
  B5     = c(rep("B5", 95), rep(NA, 5))
)

tbl

Написание различных файлов CSV один за другим можно сделать так:

B1 <- tbl %>%
  filter(B1 == "B1") %>% 
  select(Record, B1) %>% 

  fwrite(., file = "B1.csv")

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

Batch <- "B1"
f_stack <- function(Batch) {

  batch <- tbl %>%
    filter(Batch == Batch) %>% 
    select(Record, Batch)

  return(batch)

}

f_stack(Batch)

Однако он не фильтрует правильные записи. Я пропустил строку кода fwrite, потому что она не возвращает правильную таблицу. Кто-нибудь знает, как вытащить это из (желательно с purrr) Любые предложения будут высоко оценены.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

sapply(1:5,function(x){
  z<-paste0("B",x)
  write.csv(tbl[tbl[[z]]==z&!is.na(tbl[[z]]),"Record"],file=paste0(z,".csv"))
})

read.csv("B1.csv")

#    X Record
#1   1      1
#2   2      2
#3   3      3
#4   4      4
#5   5      5
#6   6      6
#7   7      7
#8   8      8
#9   9      9
#10 10     10

2 голосов
/ 21 февраля 2020

Это то, что вы ищете? Я думаю, потому что вы продолжаете повторять Batch в разных контекстах, это портит работу фильтра. Используя get(Batch), вы убедитесь, что он сравнивает вектор с вашей строкой, а не с самой строкой.

tbl %>%
     filter(get(Batch) == Batch) %>% 
     select(Record, Batch)

# A tibble: 10 x 2
   Record B1   
    <int> <chr>
 1      1 B1   
 2      2 B1   
 3      3 B1   
 4      4 B1   
 5      5 B1   
 6      6 B1   
 7      7 B1   
 8      8 B1   
 9      9 B1   
10     10 B1   

Но еще более простым решением было бы вообще пропустить функцию и использовать lapply на векторе интересующих вас имен столбцов:

Batch<-c("B1","B2","B3")
lapply(Batch, function(x) {filter(tbl,get(x)==x) %>%
    select(Record, x) %>% 
    fwrite(., file = paste0(x,".csv"))})

(обратите внимание, что это вернет список NULL с, потому что функция на самом деле ничего не возвращает в конце. Если вам нужен список отдельных фреймов данных, это тоже легко сделать)

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