R 将Lappy函数与多个csv文件桥接在一起

R 将Lappy函数与多个csv文件桥接在一起,r,R,我有多个文件要在其上使用相同的脚本。我正在努力研究如何将lappy函数与我想要使用的脚本“链接”在一起 这是一个扩展 filenamesapply函数本质上只不过是循环的花式。在您的示例中,您有一个来自csv文件的矩阵列表 lapply(mylist, function(x) ...) 这意味着列表中的每个元素(即矩阵/数据框)都表示为x。因此,可以将函数放在函数(x)后面的括号内。作为一个非常简单的例子: mat <- matrix(seq(9), ncol= 3) mat1 <

我有多个文件要在其上使用相同的脚本。我正在努力研究如何将lappy函数与我想要使用的脚本“链接”在一起

这是一个扩展


filenamesapply
函数本质上只不过是循环的花式
。在您的示例中,您有一个来自csv文件的矩阵列表

lapply(mylist, function(x) ...)
这意味着列表中的每个元素(即矩阵/数据框)都表示为
x
。因此,可以将函数放在函数(x)后面的括号内。作为一个非常简单的例子:

mat <- matrix(seq(9), ncol= 3)
mat1 <- matrix(seq(12), ncol=4)
mylist <- list(mat, mat1)
lapply(mylist, function(x) {
    nr <- nrow(x)
    nc <- ncol(x)
    return(c(nr, nc))
})

mat正常。首先,我有一些样本数据:

data <- read.table(header=TRUE, text="
       X       Y AnimalID      DATE
1 550466 4789843       10 1/25/2008
2 550820 4790544       10 1/26/2008
3 551071 4791230       10 1/26/2008
4 550462 4789292       10 1/26/2008
5 550390 4789934       10 1/27/2008
6 550543 4790085       10 1/27/2008
")
现在我有一个函数,如果超过
800
的距离,它会不断重置原点

read_march <- function(x){
  require(data.table)
  data <- fread(x)

  #Perform some quick data prep before entering animal march function
  data[, X.BEG := X[1L]]
  data[, Y.BEG := Y[1L]]
  data[, NOT.CHECKED := 1L]

      animal_march <- function(data){ 
          data[, NSD := sqrt((X.BEG-X)^2+(Y.BEG-Y)^2)]
          data[NOT.CHECKED==1L, CUM.VAL := cumsum(cumsum(NSD>800))]
          data[, X.BEG := ifelse(CUM.VAL>1L, data[CUM.VAL==1L]$X, X.BEG)]
          data[, Y.BEG := ifelse(CUM.VAL>1L, data[CUM.VAL==1L]$Y, Y.BEG)]
          data[, NOT.CHECKED := 1*(CUM.VAL>1L)]
          data[, CUM.VAL := 0L]

        if (data[, sum(NOT.CHECKED)]==0L){
          data[, GRP := .GRP, by=.(X.BEG,Y.BEG)] #Here, GRP is created
          return(data)
        } else {
          return(animal_march(data))
        }
      }

  result <- animal_march(data=data)
  return(result)
}

请注意,距离超过800后,
X.BEG
Y.BEG
是如何不断变化的。

您是否正在尝试计算成对距离?也许
dist
功能会对您有所帮助。不,每个csv文件都包含单个动物的位置。我将其编码为计算净平方位移,直到达到1700m,然后重新开始计算。什么是
?每个csv中是否有多个动物?每组代表每个1700m NSD的每组位置。例如,假设40个位置超过1700米,所有这些位置都将被分配为第1组。如果在超过1700米之前是41-92号位置,则为第2组。希望这是有意义的。每次我试图用一个parathesis(lappy,mylist,function(x){…})括起lappy时,就会出现一个错误——“意外”)。所以我需要用一个(x)来结束每一行,比如“Group[1],错误告诉你,你有一个额外的括号。关于你的下一个评论,你真的需要了解更多的R。对于给定的循环,
x
是你的矩阵,你不需要仅仅添加它。我假设像XLOC这样的东西是这个矩阵的一部分。您需要适当地分配变量,而不仅仅是将脚本视为理所当然。你有更多的编程要做。代码减去lappy在一个csv上工作得很好。我试图弄清楚如何使用lappy将代码应用到多个CSV。我在网上找到的lappy函数太简单(数学运算),对我没有帮助。请尝试将
x$
放在对象的开头。您必须先将数据集
附加到
上,数据集才能正常工作。例如更改
组[1]哇!那太好了!!我真的很感谢你花时间来帮助我。嗨,迈克,想知道你会如何调整代码,为每个NSD组添加一个标识符列?以big.animal.data为例,列“X”将为1,1,1,2,3,3,这与每个800m NSD的步骤顺序相对应?当然。只是稍微改变了一下。我的坏-我在看xbeg和ybeg的cols。
write.csv(data, file="data.csv", row.names=FALSE)
read_march <- function(x){
  require(data.table)
  data <- fread(x)

  #Perform some quick data prep before entering animal march function
  data[, X.BEG := X[1L]]
  data[, Y.BEG := Y[1L]]
  data[, NOT.CHECKED := 1L]

      animal_march <- function(data){ 
          data[, NSD := sqrt((X.BEG-X)^2+(Y.BEG-Y)^2)]
          data[NOT.CHECKED==1L, CUM.VAL := cumsum(cumsum(NSD>800))]
          data[, X.BEG := ifelse(CUM.VAL>1L, data[CUM.VAL==1L]$X, X.BEG)]
          data[, Y.BEG := ifelse(CUM.VAL>1L, data[CUM.VAL==1L]$Y, Y.BEG)]
          data[, NOT.CHECKED := 1*(CUM.VAL>1L)]
          data[, CUM.VAL := 0L]

        if (data[, sum(NOT.CHECKED)]==0L){
          data[, GRP := .GRP, by=.(X.BEG,Y.BEG)] #Here, GRP is created
          return(data)
        } else {
          return(animal_march(data))
        }
      }

  result <- animal_march(data=data)
  return(result)
}
#Apply function to each csv file
library(data.table)
files = list.files(pattern="*.csv")
animal.csvs <- lapply(files, function(x) read_march(x))
big.animal.data <- rbindlist(animal.csvs) #Retrieve one big dataset
> big.animal.data
        X       Y AnimalID      DATE  X.BEG   Y.BEG NOT.CHECKED       NSD CUM.VAL GRP
1: 550466 4789843       10 1/25/2008 550466 4789843           0    0.0000       0   1
2: 550820 4790544       10 1/26/2008 550466 4789843           0  785.3133       0   1
3: 551071 4791230       10 1/26/2008 550466 4789843           0 1513.2065       0   1
4: 550462 4789292       10 1/26/2008 551071 4791230           0 2031.4342       0   2
5: 550390 4789934       10 1/27/2008 550462 4789292           0  646.0248       0   3
6: 550543 4790085       10 1/27/2008 550462 4789292           0  797.1261       0   3