首页 > 解决方案 > 在 r 中执行多个计算的列表函数

问题描述

我最近开始使用 R,并感谢 SO 社区帮助我创建了 100 多个 tibbles(按分钟划分)的数据,类似于下面的数据。

time1      pid    mlat mlong   malt m_time 
1 23:57:00 2A     434. 8347. 0.140  m_2357
2 23:57:00 2D     433. 8353. 0.0702 m_2357
3 23:57:00 3D     433. 8349. 0.0135 m_2357
4 23:57:00 4A     434. 8364. 0.147  m_2357
5 23:57:00 4B     433. 8351. 0.162  m_2357

下面的函数为单个数据集提供了一个解决方案。

pd<- function(mtime){
dm <- data.frame(x=mtime$mlat, #dm = distance matrix
            y=mtime$mlong, 
            z=mtime$malt, 
            row.names= mtime$pid)
ed<- dist(dm) #em = euclidean distance
em <- as.matrix(ed) #em = euclidean matrix
em <- melt(em)[melt(upper.tri(em))$value,] 
names(em)<- c("pid","intercept", "distance") 
e_df <- as.data.frame(em)
e_df$distance <- round((e_df$distance/.0005399565), digits = 0)
e_df<- arrange(e_df,distance)
write.csv(e_df,"m_2357.csv")
}
pd(m_2357)

reprex 包(v0.3.0)于 2020-04-19 创建

在创建并将小标题嵌入到列表中(使用 m_time)之后,我最接近解决这个问题的是:

mylist2 <- lapply(mylist, function(x){
  dm <- data.frame(x=mylist[[i]][["mlat"]],
                   y=mylist[[i]][["mlong"]], 
                   z=mylist[[i]][["malt"]], 
                   row.names= mylist[[i]][["pid”]]) … 

这将一个正确的解决方案重复了 180 次,所以我认为我很接近(我也作为一个值存储在我的环境中,这可能是个问题吗?)。不幸的是,我找不到任何对列表进行多次计算的函数示例。在我花了一天的大部分时间玩组合之后,我决定寻求帮助。

我的问题是:将数据放入列表后,如何为列表中的每个小标题编写一个 lapply 函数?

标签: rlistfunctionlapply

解决方案


无需扩展现有功能代码。只需将您的数据框/小标题列表直接运行到您的函数中,lapply例如:output <- lapply(mylist, pd).

但是,您的函数现在输出一个名为"m_2357.csv". 因此,所有迭代都将替换此文件,将上次运行结果保留在此单个文件中。因此,您需要使文件名动态显示为您的m_time列。另外,请考虑返回数据帧,而不是write.csv通常的结果NULL

pd <- function(mtime){
  dm <- data.frame(x=mtime$mlat,
                   y=mtime$mlong, 
                   z=mtime$malt, 
                   row.names= mtime$pid)
  ...

  # DYNAMIC VARIABLE NAME
  write.csv(e_df, paste(mtime$m_time[1], ".csv")

  # RETURN ACTUAL DATA FRAME
  return(e_df)
}


new_df_list <- lapply(mylist, pd)

顺便说一句,如果您的原始设置是一个大型数据框/小标题,所有 180 个小标题与列m_time堆叠在一起以区分集合,您可以使用by(面向对象的包装器tapply)运行函数,按列传递子集, m_time , 进入函数:

new_df_list <- by(my_master_data_frame, my_master_data_frame$m_time, pd)

推荐阅读