【问题标题】:Writing different .csv files based on different value and column combinations in R根据R中不同的值和列组合编写不同的.csv文件
【发布时间】:2020-02-21 13:50:08
【问题描述】:

我想根据值和列组合编写不同的 .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 代码行,因为它没有返回正确的 tbl。有人知道如何拉这个(最好是purrr)任何建议将不胜感激。

【问题讨论】:

    标签: r iteration purrr


    【解决方案1】:

    这就是你要找的吗?我认为因为您在不同的上下文中不断重复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"))})
    

    (请注意,这将返回 NULLs 的列表,因为该函数实际上并没有返回任何内容。如果您想要单个数据帧的列表,这也很容易)

    【讨论】:

    • get() 成功了!我不知道这个功能,谢谢!答案已被接受。关于您的第二个答案:我认为您在 fwrite 之后错过了第二个 ),但确实完全跳过该功能可能会更好。
    • 是的,我确实错过了额外的 )... 对此感到抱歉。修正了答案。
    【解决方案2】:
    
    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多