如何在R的重塑包中循环dcast功能

jes*_*ssc 3 loops r reshape lapply

作为一个相对较新的R用户,我在使用任何循环功能时都遇到麻烦。我看过很多教程,但是其中的示例通常非常基础,因此易于执行。但是,我需要创建稍微复杂一些的循环,并且在弄清楚如何做时遇到很多麻烦。在这里和其他论坛上有一些相关的循环问题,但没有一个完全符合我的需求,尽管我尝试为当前问题改编其他答案,但我仍然遇到错误。

我有2000个.csv文件,其数据以长格式数据制成表格(简化示例):

solution1    
> sol1     sol2     Istat
> s1       s2       0.435
> s1       s3       0.456
> s1       s4       0.845
> s1       s5       0.234
Run Code Online (Sandbox Code Playgroud)

它基本上是我对2000个单个解决方案的成对比较的摘要,并以“ Istat”值概括了两个解决方案之间的相似性。

我正在尝试将这2000个.csv文件中的每个文件广播到宽格式表中(使用R中的reshape包),以使它们看起来像下面的示例:

     s1     s2     s3     s4     s5
s1   NA     0.435  0.456  0.845  0.234
Run Code Online (Sandbox Code Playgroud)

我知道如何只用一个.csv文件执行一次:

stat.cast <- dcast(solution1, sol2 ~ sol1, value.var="Istat")
Run Code Online (Sandbox Code Playgroud)

但是我似乎无法将其处理成一个for循环函数,甚至lapply无法使用,这似乎也可以在这里解决。

我最接近的for功能:

 # Get files from directory
loopout = "/Users/jc219806/Documents/Chapter 1/ANALYSES/R work/Istat/last_LoopOut/"
# List of file names inside folder
solutions <- list.files(loopout)
# Read all 2000 files inside
all.data <- lapply(solutions, read.csv, header=TRUE)
# Loop for performing reshape cast function to each listed dataframe
for (i in 1:length(all.data))
  {
  all.cast <- dcast(all.data, sol2 ~ sol1, value.var="Istat")
  }
Run Code Online (Sandbox Code Playgroud)

但是,它始终给我一个错误,即即使在我拥有的数据框列表中(上面代码中的“ solutions”对象),也无法识别输入中的“ Istat”值。

并具有以下lapply功能:

lapply(solutions, dcast(all.data, sol2 ~ sol1, value.var="Istat"))
Run Code Online (Sandbox Code Playgroud)

我收到相同类型的错误:

Error: value.var (Istat) not found in input
Run Code Online (Sandbox Code Playgroud)

我不明白为什么,因为它在数据框列表中作为2000个数据框中的每个变量之一列出。似乎我无法正确循环遍历每个2000 .csv文件,但是我不知道该如何解决。我还想知道是否还可以编写代码,使其根据列名将所有2000个输出绑定在一起而循环?它循环疯狂。

我希望这不是我认为的那样复杂的问题。任何帮助(以及一些详细的说明)或有用的指导,将不胜感激。谢谢

sha*_*ker 5

你写了:

for (i in 1:length(all.data))
  {
  all.cast <- dcast(all.data, sol2 ~ sol1, value.var="Istat")
  }
Run Code Online (Sandbox Code Playgroud)

您应该写的内容:

all.cast <- list()
for (i in 1:length(all.data)) {
  all.cast[[i]] <- dcast(all.data[[i]], sol2 ~ sol1, value.var = "Istat")
}
Run Code Online (Sandbox Code Playgroud)

但是,更“ R风格”的解决方案是:

all.cast <- lapply(all.data, dcast, sol2 ~ sol1, value.var = "Istat")
Run Code Online (Sandbox Code Playgroud)

希望这可以弄清楚您做错了什么。