代码之家  ›  专栏  ›  技术社区  ›  Duerna

定义一个函数然后应用到一个列表

  •  0
  • Duerna  · 技术社区  · 6 年前

    我试图写一个函数(我是R的新手,我的大部分知识都是从这个网站学习的,谢谢)

    我想把我的功能应用到一个列表中。列表包含一些“.csv”文件。

    在我的文件夹中的所有CSV文件看起来像下面的图片,相同的结构,但具有不同的列号。

    我想:

    1. 基于“frame”列,删除所有包含单词“t”的行,
      然后我得到“110*n1”行数据。
    2. 删除所有包含“标志”字的列,它们是空列。
    3. 删除第一列。然后是“2*n2”列。
    4. 将mulit列重塑为2列数据,现在得到“110*n3”行数据。
    5. 重复“1,2,3,4,…,110”作为SEEILS数,n次(n=N3),重新绑定为列。
    6. 表格“1,2,3,…,n3”,每重复110次,做成一个小柱。
    7. 将新表导出为TXT文件。

    enter image description here

    以下是我迄今为止所做的:

    T_function <- function(x) {
        data.df <- read.csv(x, skip = 1,header=TRUE, na.strings=c("NA","NaN", " ","*"),
                            dec=".", strip.white=TRUE)
        filename <- substr(x = x, start = 1, stop = (nchar(x)-4))
        data.df[!grepl("T", data.df$Frame),]  
        data.df <- data.df [,-1]
        data.df <- data.df [,colSums(is.na(data.df))<nrow(data.df)]
    
        splitter <- function(indf, ncols) {
            if (ncol(indf) %% ncols != 0) stop("Not the right number of columns to split")
            inds <- split(sequence(ncol(indf)), c(0, sequence(ncol(indf)-1) %/% ncols))
            temp <- unlist(lapply(inds, function(x) c(t(indf[x]))), use.names = FALSE)
            as.data.frame(matrix(temp, ncol = ncols, byrow = TRUE))
        }
    
        out <- splitter(data.df, 2)
        list <- 1:110
        from <- which(out$V1 == 1)
        to <- c((from-1)[-1], nrow(out)) 
        end <- c(to/110)
        list2 <- rep(list,length(to/110))
    
        out$Number <- unlist(list2)
        out$Number <- as.factor(out$Number)
        list3 <- rep(1:end,each=110)
        out$slice <- unlist(list3)
        out$slice <- as.factor(out$slice)
    
        write.table(x = data.df, 
                    file = paste0(filename, "_analysis.txt"), 
                    sep = ",",quote=F)
    }
    

    函数似乎无法添加正确的“out$number”和“out$slice”。

    filenames <- list.files(path = "",pattern="csv",full.names = T)
    
    sapply(filenames, FUN = T_function)
    

    我试图将我的功能应用于列表中的所有文件,而在第一个文件旁边,我似乎无法让其他文件工作。

    有人能帮我找出并解决问题吗?

    0 回复  |  直到 6 年前