编写循环以浏览带有子列表的大列表并保存这些子列表

时间:2019-11-12 13:22:26

标签: r

我想从带有很多子列表的大型列表中提取数据,这些子列表称为“摘要” https://www.dropbox.com/s/uiair94p0v7z2zr/summary10.csv?dl=0

此文件是患者和药物对剂量反应曲线拟合的汇编。我只与10位患者共享一个小文件,其中105种药物以及x和y作为每100pt拟合的读数。 我想将每个患者和每种药物的所有配比保存在单独的文件中。

我试图将列表写入df以使用tidyverse,但没有进行管理。我只是从R开始的,所以这对我来说很复杂。

for (i in 1:length(summary10))
{for (j in 1:length(summary10[[i]]))
{x1 <- summary10[[i]][[j]][[1]]  
y1 <- summary10[[i]][[j]][[2]]
print(summary10[[i]][[j]]);}}

该循环有效,但是我不知道如何将它们保存在不同的文件中,这样我才能知道什么是什么。我尝试了一些在网上找到的东西,但是没有用:

for (i in 1:length(summary10))
{for (j in 1:length(summary10[[i]]))
{x1 <- summary10[[i]][[j]][[1]] 
y1 <- summary10[[i]][[j]][[2]] 
cbind(x1,y1) -> resp
write.csv(resp, file = paste0(summary[[i]], ".-csv"), row.names = FALSE)                          
}}
  

Error in file(file, ifelse(append, "a", "w")) : invalid 'description' argument In addition: Warning message: In if (file == "") file <- stdout() else if (is.character(file)) { : the condition has length > 1 and only the first element will be used

1 个答案:

答案 0 :(得分:1)

当我们看不到您的制作方式summary10时,很难预料出什么问题。我绝对无法猜测您是如何从表格文件中找到列表的(或者可能是summary10的列表)。

但是最后,您的错误表明您在file = paste0(summary[[i]], ".-csv")参数中提供了非法文件名。调试的第一个技巧就是简单地打印到控制台。试试看这个尺寸:

cbind(x1,y1) -> resp
cat(paste0(summary[[i]], ".-csv", '\n')   # <----- 
# use `cat` to print to console the contents of your expressiosn
write.csv(resp, file = paste0(summary[[i]], ".-csv"), row.names = FALSE)

是什么?它应该计算为一个简单的字符串,例如B.M.21.S.-csv,但事实并非如此。

乍一看,我想您会误拼您的变量。 summary通常是一个函数,而您可能正在寻找summary10。不过,summary10的第i个元素看起来可能是列表本身,因此您的表达式将无法生成简单的字符串。


更新为summary10

我总是建议使用str检查对象的结构。对于列表,请使用参数max.level避免打印无穷的嵌套列表:

> str(summary10, max.level=1)
List of 10
 $ B-HR-25 :List of 106
 $ B-SR-22 :List of 106
 $ B-VHR-01:List of 106
 $ B-SR-23 :List of 106
 $ B-SR-24 :List of 106
 $ B-HR-21 :List of 106
 $ B-M-21  :List of 106
 $ B-SR-21 :List of 106
 $ B-MR-01 :List of 106
 $ B-M-01  :List of 106

然后进一步:

> str(summary10[[1]], max.level=2)
List of 106
 $ PP242             :List of 2
  ..$ x: num [1:100] 1 1.1 1.2 1.32 1.45 ...
  ..$ y: num [1:100] 0.923 0.922 0.921 0.92 0.919 ...
 $ AZD8055           :List of 2
  ..$ x: num [1:100] 1 1.1 1.2 1.32 1.45 ...
  ..$ y: num [1:100] 0.953 0.953 0.953 0.952 0.952 ...

因此对象summary10是患者的集合(列表的列表); summary10[1]是包含第一位患者,summary10[[1]]的第一位患者(列表本身)及其对药物的反应的集合。

那么当您尝试从summary10[[i]]创建文件名时会发生什么?试试吧,我不会在这里打印输出。返回str(summary10),患者的名称(“ B-HR-25”等)是条目的名称。使用names(summary10)获取它们。作为练习,比较names(summary10)names(summary10)[1]names(summary10[1])names(summary10[[1]])