r语言 - 用数学函数对多个数据帧进行循环



我有5个数据帧,根据一个变量从一个数据帧中分离,我想基于每个数据帧的相同3列应用相同的函数。每个包含10,000行。

我的数据:

Dist     X    Y  deg ofs      Z
1 20.21 499.3 3577 4.77   0 19.750
2 20.23 482.3 3578 4.77 -50 19.731
3 20.23 481.3 3578 4.77 -25 19.741
4 20.23 480.3 3578 4.77   0 19.750
5 20.23 479.3 3578 4.77  25 19.749
6 20.24 478.3 3578 4.77  50 19.740

像这样分割:

splitdf <- split(df, df$ofs)
str(offset)
X1 <- splitdf$`-50`
X2 <- splitdf$'-25'
X3 <- splitdf$'0'
X4 <- splitdf$'25'
X5 <- splitdf$'50'
df.list <- list(X1,X2,X3,X4,X5)

创建了两个三角函数:

(X +距离* cos(角度)),(Y -距离* sin(角度))

NewX <- function(x){
df.list[[i]][2] + df.list[[i]][5] * cos(df.list[[i]][4]) 
}
NewY <- function(x) {
df.list[[i]][3] - df.list[[i]][5] * sin(df.list[[i]][4]) 
}

然后,我创建了一个循环,将这些函数应用于每个数据帧,从而创建新的列。

for (i in 1:length(df.list)){
df.list[[i]]$newcol1 <-  lapply(df.list[[i]]$X, FUN=NewX)
df.list[[i]]$newcol2 <- lapply(df.list[[i]]$Y, FUN=NewY)
}    

不幸的是,这不会产生结果或错误消息。但是控制台有几分钟占线。

在使用

分隔数据帧之前,我再次尝试使用数据帧:
NewX <- function(x){
df[2] + df[5] * cos(df[4]) 
}
NewY <- function(x) {
df[3] - df[5] * sin(df[4]) 
}
for (i in 1:length(df)){
df$newX <-  lapply(df$X, FUN=NewX)
df$newY <- lapply(df$Y, FUN=NewY)
}  

这种方法太重,一小时后不产生结果。在这两种情况下我不得到任何错误消息所以很难知道我做错了什么。

有人有什么想法吗?谢谢!

编辑

我在单个文件上运行循环,更改代码以添加输出作为新的数据帧

for (i in 1:length(df)){
lapply(df$X, FUN=NewX)
lapply(df$Y, FUN=NewY) -> newdf
}    

创建一个NewX列,在每个单元格中是一个包含50,000个结果的单列数据帧。去掉循环,用管道运行,得到Error in FUN(X[[i]],...): Unused argument

实际上你可以用by来做。

fun <- function(x) cbind(x, newcol1=x[, 2] + x[, 5]*cos(x[, 4]), newcol2=x[, 3] - x[, 5]*sin(x[, 4]))
by(df, df$ofs, fun)
# df$ofs: -50
#    Dist     X    Y  deg ofs      Z newcol1  newcol2
# 2 20.23 482.3 3578 4.77 -50 19.731 479.421 3528.083
# --------------------------------------------------------------------------------------------- 
#   df$ofs: -25
#    Dist     X    Y  deg ofs      Z  newcol1  newcol2
# 3 20.23 481.3 3578 4.77 -25 19.741 479.8605 3553.041
# --------------------------------------------------------------------------------------------- 
#   df$ofs: 0
#    Dist     X    Y  deg ofs     Z newcol1 newcol2
# 1 20.21 499.3 3577 4.77   0 19.75   499.3    3577
# 4 20.23 480.3 3578 4.77   0 19.75   480.3    3578
# --------------------------------------------------------------------------------------------- 
#   df$ofs: 25
#    Dist     X    Y  deg ofs      Z  newcol1  newcol2
# 5 20.23 479.3 3578 4.77  25 19.749 480.7395 3602.959
# --------------------------------------------------------------------------------------------- 
#   df$ofs: 50
#    Dist     X    Y  deg ofs     Z newcol1  newcol2
# 6 20.24 478.3 3578 4.77  50 19.74 481.179 3627.917

如果你打算重新组装它:

do.call(rbind, by(df, df$ofs, fun))
#      Dist     X    Y  deg ofs      Z  newcol1  newcol2
# -50 20.23 482.3 3578 4.77 -50 19.731 479.4210 3528.083
# -25 20.23 481.3 3578 4.77 -25 19.741 479.8605 3553.041
# 0.1 20.21 499.3 3577 4.77   0 19.750 499.3000 3577.000
# 0.4 20.23 480.3 3578 4.77   0 19.750 480.3000 3578.000
# 25  20.23 479.3 3578 4.77  25 19.749 480.7395 3602.959
# 50  20.24 478.3 3578 4.77  50 19.740 481.1790 3627.917

相关内容

  • 没有找到相关文章

最新更新