【问题标题】:List function to perform multiple calculations in r在 r 中执行多个计算的列表函数
【发布时间】:2020-04-19 16:27:17
【问题描述】:

我最近开始使用 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 package (v0.3.0) 于 2020 年 4 月 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 函数?

【问题讨论】:

    标签: r list function lapply


    【解决方案1】:

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

    但是,您的函数现在输出一个名为 "m_2357.csv" 的硬编码 CSV。所以所有的迭代都会替换这个文件,而最后一次运行的结果会留在这个 single 文件中。因此,您需要使文件名动态显示为您的 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)
    

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

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

    【讨论】:

    • 感谢您的帮助。我发现您的第二个答案最有帮助,因为它减少了代码并使我的项目更易于阅读。
    • 太棒了!我发现by 是一种未充分利用但有用的方法。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多