我想从带有很多子列表的大型列表中提取数据,这些子列表称为“摘要” 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
答案 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]])
。