R 使用函数修改数据帧中的列

R 使用函数修改数据帧中的列,r,recursion,dataframe,read.table,R,Recursion,Dataframe,Read.table,我正在尝试修改数据框列和位置。最后,我找到了一些解决方案,但我想在一个函数中为目录中的所有数据集执行所有进程,并覆盖实际数据 kw <- matrix(1:11400, ncol = 19) # to make sample data kw <- kw[, !(colnames(kw) %in% c("V18","V19"))] # to remove last two cols add <- c(kw$V18 <- 0,kw$V19<- 0) # add n

我正在尝试修改数据框列和位置。最后,我找到了一些解决方案,但我想在一个函数中为目录中的所有数据集执行所有进程,并覆盖实际数据

kw <- matrix(1:11400, ncol = 19) # to make sample data
kw <- kw[, !(colnames(kw) %in% c("V18","V19"))]  # to remove last two cols
add <- c(kw$V18 <- 0,kw$V19<- 0)   # add new columns with all zero values
kw$V1 <- kw$V1 * 1000  # to modify first col of data frame
kw <- kw[ ,c(1,18:19,2:17)] # to replace col positions

使用data.table,您可以执行以下操作:

setcolorder(
  fread(yourfile)[, c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], c(1, 18:19, 2:17))
myFun <- function(infile) {
  require(data.table)
  write.table(
    setcolorder(
      fread(infile)[
        , c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], 
      c(1, 18:19, 2:17)), 
    file = gsub("(.*)(\\..*)", "\\1_new\\2", infile), 
    row.names = FALSE)
}
因此,如果您确实需要一个函数,您可以执行以下操作:

setcolorder(
  fread(yourfile)[, c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], c(1, 18:19, 2:17))
myFun <- function(infile) {
  require(data.table)
  write.table(
    setcolorder(
      fread(infile)[
        , c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], 
      c(1, 18:19, 2:17)), 
    file = gsub("(.*)(\\..*)", "\\1_new\\2", infile), 
    row.names = FALSE)
}

默认情况下,此函数重命名而不是覆盖您的文件,并在文件末尾添加新的扩展名。

对于data.table,您可以执行以下操作:

setcolorder(
  fread(yourfile)[, c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], c(1, 18:19, 2:17))
myFun <- function(infile) {
  require(data.table)
  write.table(
    setcolorder(
      fread(infile)[
        , c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], 
      c(1, 18:19, 2:17)), 
    file = gsub("(.*)(\\..*)", "\\1_new\\2", infile), 
    row.names = FALSE)
}
因此,如果您确实需要一个函数,您可以执行以下操作:

setcolorder(
  fread(yourfile)[, c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], c(1, 18:19, 2:17))
myFun <- function(infile) {
  require(data.table)
  write.table(
    setcolorder(
      fread(infile)[
        , c("V1", "V18", "V19") := list(V1 * 1000, 0, 0)], 
      c(1, 18:19, 2:17)), 
    file = gsub("(.*)(\\..*)", "\\1_new\\2", infile), 
    row.names = FALSE)
}

默认情况下,此函数将重命名而不是覆盖文件,并在文件末尾添加新的扩展名。

这可能是另一种方式

读取所有文件并将其存储在如下列表中

# to list down all the files in the directory
files.new = list.files(directory.path, recursive = TRUE, pattern=".avgm")

# to read all the files and store it in list
file.contents = lapply(paste(directory.path,files.new, sep="/"), read.table, sep='\t', header = TRUE)
outlist = lapply(file.contents, function(x){ 
# modifications 
kw <- x[, !(colnames(x) %in% c("V18","V19"))]
add <- c(kw$V18 <- 0,kw$V19<- 0)
kw$V1 <- kw$V1 * 1000
kw <- kw[ ,c(1,18:19,2:17)]
})
接下来,您可以对列表中的每个数据集进行如下修改

# to list down all the files in the directory
files.new = list.files(directory.path, recursive = TRUE, pattern=".avgm")

# to read all the files and store it in list
file.contents = lapply(paste(directory.path,files.new, sep="/"), read.table, sep='\t', header = TRUE)
outlist = lapply(file.contents, function(x){ 
# modifications 
kw <- x[, !(colnames(x) %in% c("V18","V19"))]
add <- c(kw$V18 <- 0,kw$V19<- 0)
kw$V1 <- kw$V1 * 1000
kw <- kw[ ,c(1,18:19,2:17)]
})
将数据写入文件

write.files(outlist, "/directory/path")

这可能是另一种方式

读取所有文件并将其存储在如下列表中

# to list down all the files in the directory
files.new = list.files(directory.path, recursive = TRUE, pattern=".avgm")

# to read all the files and store it in list
file.contents = lapply(paste(directory.path,files.new, sep="/"), read.table, sep='\t', header = TRUE)
outlist = lapply(file.contents, function(x){ 
# modifications 
kw <- x[, !(colnames(x) %in% c("V18","V19"))]
add <- c(kw$V18 <- 0,kw$V19<- 0)
kw$V1 <- kw$V1 * 1000
kw <- kw[ ,c(1,18:19,2:17)]
})
接下来,您可以对列表中的每个数据集进行如下修改

# to list down all the files in the directory
files.new = list.files(directory.path, recursive = TRUE, pattern=".avgm")

# to read all the files and store it in list
file.contents = lapply(paste(directory.path,files.new, sep="/"), read.table, sep='\t', header = TRUE)
outlist = lapply(file.contents, function(x){ 
# modifications 
kw <- x[, !(colnames(x) %in% c("V18","V19"))]
add <- c(kw$V18 <- 0,kw$V19<- 0)
kw$V1 <- kw$V1 * 1000
kw <- kw[ ,c(1,18:19,2:17)]
})
将数据写入文件

write.files(outlist, "/directory/path")

所有的文件都有相同的列数和相同的一般结构吗?而且,它们的结构基本上是矩形的吗?read.table有什么问题吗?@Ananda Mahto为这个低效的例子感到抱歉。所有文件都有相同数量的矩形结构的列。所有文件都有相同数量的列和相同的一般结构吗?而且,它们的结构基本上是矩形的吗?read.table有什么问题吗?@Ananda Mahto为这个低效的例子感到抱歉。所有文件都具有相同数量的矩形结构列。FREADW中的错误:“input”必须是包含文件名、命令、文件完整路径、以“http://”或“file://”开头的URL或输入数据的单个字符串itself@Thabescity,是否先加载data.table包?您是否可以编辑您的问题,将readLines5LSTT-test10.avgm的输出包括在内,n=10,以便我们更好地了解您的数据结构?@Thabescity,这是为了直接处理目录中的文件,而不是kw对象。如果要查看它对kw对象的影响,请在我共享的第一个代码块中将freadyourfile替换为as.data.tablekw。是使用从目录加载数据kw@Thabescity,否,如果数据已读入,则跳过fread部分。在freadkw中尝试新错误:“input”必须是包含文件名、命令、文件完整路径、以“http://”或“file://”开头的URL或输入数据的单个字符串itself@Thabescity,是否先加载data.table包?您是否可以编辑您的问题,将readLines5LSTT-test10.avgm的输出包括在内,n=10,以便我们更好地了解您的数据结构?@Thabescity,这是为了直接处理目录中的文件,而不是kw对象。如果要查看它对kw对象的影响,请在我共享的第一个代码块中将freadyourfile替换为as.data.tablekw。是使用从目录加载数据kw@Thabescity,否,如果数据已读入,则跳过fread部分。尝试新的