我有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