【问题标题】:How to pass a function row by row in R and export results in a data frame如何在R中逐行传递函数并将结果导出到数据框中
【发布时间】:2021-12-22 06:44:54
【问题描述】:

我是 R 的新手。 我有一个使用 3 个数据框生成报告的函数(基本上 do.reports 会在表格之间进行一些计算并将它们合并。

create_report = do_reports(df1, df2, df3)

ID = c("ID1", "ID2", "ID3")
size = c(2, 5, 4)
p = c(0.05, 0.1, 0.3)
var = c(0.3, 0.5, 1.2)
location = c("blood", "tissue", "blood")

df1 = data.frame(ID  = ID , size= size, p = p)
df2 = data.frame(ID  = ID , var = var)
df3 = data.frame(ID  = ID , location = location)

此输出包含 2 个不同的对象(create_report[1]create_report[2]

#expected create_report[1]

create_report[1] = data.frame(ID  = ID , location = location, size = size , p=p)

 #expected create_report[2]

create_report[2] = data.frame(location = location, size = size , p=p, var=var)

但是,我想在 df2 中逐行使用do_reports(类似于create_report = do_reports(df1, df2[1,], df3),独立保存结果,完成后将所有结果合并到一个表中。 到目前为止我尝试过的是:

for (i in seq_len(nrow(df2) {
  create_report = do_reports(df1, df2, df3)
}

我知道在它上面使用循环可能非常乏味,所以我想知道这里是否有人可以帮助我。

谢谢

【问题讨论】:

  • 欢迎来到 SO,Lila McPhee!请让这个问题可重现。这包括您尝试过的示例代码(包括列出非基础 R 包以及收到的任何错误/警告)、示例明确数据(例如,data.frame(x=...,y=...) 或来自dput(head(x)) 的输出),和给定输入的预期输出。参考:stackoverflow.com/q/5963269minimal reproducible examplestackoverflow.com/tags/r/info
  • 感谢您的评论,现在更清楚了吗?

标签: r function


【解决方案1】:
library(tidyverse)
ID <- c("ID1", "ID2", "ID3")
size <- c(2, 5, 4)
p <- c(0.05, 0.1, 0.3)
var <- c(0.3, 0.5, 1.2)
location <- c("blood", "tissue", "blood")

df1 <- data.frame(ID = ID, size = size, p = p)
df2 <- data.frame(ID = ID, var = var)
df3 <- data.frame(ID = ID, location = location)


do_report <- function(ID, size, p, var, location) {
  # create some result
  result <- "test"
  
  write_rds(result, file = tempfile())
}

list(df1, df2, df3) %>%
  reduce(full_join) %>%
  mutate(result = list(ID, size, p, var, location) %>% pmap(do_report))

【讨论】:

  • 我想你误解了我的问题。我想要做的是在df2中逐行传递函数do_reports(类似于create_report = do_reports(df1,df2 [1,],df3),独立保存结果,一旦完成,将所有结果合并到一个表中。我可以用循环来做,但效率不高。
  • 您没有提供问题中提到的函数do.reportsdo_report。保存是否意味着将结果写入文件?
  • 是的,我的意思是为每一行编写结果(或单独保存)并在最后将它们合并到一个 df 中
  • list(df1, df2, df3) %&gt;% lapply(do_report) 可以用来代替 for 循环在列表的每个元素上应用函数 do_report
  • 但我想逐行传递它,正如我在 for 循环中看到的那样
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
相关资源
最近更新 更多