Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中重塑包中循环dcast函数_R_Loops_Reshape_Lapply - Fatal编程技术网

如何在R中重塑包中循环dcast函数

如何在R中重塑包中循环dcast函数,r,loops,reshape,lapply,R,Loops,Reshape,Lapply,作为一个相对较新的R用户,我对任何循环函数都有困难。我看过很多教程,但其中的示例通常非常基本,因此易于执行。然而,我需要创建稍微复杂一点的循环,并且在弄清楚如何创建循环时遇到了很多困难。在这里和其他论坛上有一些相关的循环问题,但没有一个完全符合我的需要,尽管我已经尝试根据我当前的问题调整其他答案,但我一直遇到错误 我有2000个.csv文件,其中的数据以长格式数据制表(简化示例): 这基本上是我对2000个单独解决方案的两两比较的总结,解决方案之间的相似性以“Istat”值总结 我正在尝试将这些

作为一个相对较新的R用户,我对任何循环函数都有困难。我看过很多教程,但其中的示例通常非常基本,因此易于执行。然而,我需要创建稍微复杂一点的循环,并且在弄清楚如何创建循环时遇到了很多困难。在这里和其他论坛上有一些相关的循环问题,但没有一个完全符合我的需要,尽管我已经尝试根据我当前的问题调整其他答案,但我一直遇到错误

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

这基本上是我对2000个单独解决方案的两两比较的总结,解决方案之间的相似性以“Istat”值总结

我正在尝试将这些2000.csv文件中的每个文件dcast成宽格式表(使用R中的重塑包),使它们看起来像(上面的示例如下):

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

stat.cast <- dcast(solution1, sol2 ~ sol1, value.var="Istat")
但它一直给我一个错误,即它无法从输入中识别“Istat”值——即使它在我拥有的数据帧列表中(“上面代码中的解决方案”对象)

使用
lappy
功能:

 # 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")
  }
lapply(solutions, dcast(all.data, sol2 ~ sol1, value.var="Istat"))
我得到了相同类型的错误:

Error: value.var (Istat) not found in input
我不明白为什么,因为它列在数据帧列表中,作为2000个数据帧中每个数据帧的变量之一。似乎我没有让它正确地循环使用我的每个2000.csv文件,但我不知道如何修复它。我还想知道是否也可以编写代码,以便根据列名循环绑定所有2000个输出?这简直是疯了

我希望这不是一个在我看来那么复杂的问题。任何帮助(以及一些详细的解释)或有用的指导都将受到极大和真诚的感谢。谢谢

“all.data”是一个数据帧列表。要在列表上循环,可以使用
lappy
和匿名函数调用(为了清楚起见),并对其应用
dcast

library(reshape2)
lapply(all.data, function(x) dcast(x, sol1 ~ sol2, value.var="Istat"))
或者代替单独执行
dcast
,列表可以
rbind
到一个数据帧,每个列表元素都有一个分组变量,然后从
库(tidyr)
执行
dcast
spread

或使用
data.table

library(data.table)
dcast(rbindlist(Map(cbind, all.data, group=seq_along(all.data))),
                 group + sol1 ~sol2, value.var='Istat')
数据
all.data您写道:

for (i in 1:length(all.data))
  {
  all.cast <- dcast(all.data, sol2 ~ sol1, value.var="Istat")
  }
for(1中的i:长度(全部数据))
{

all.cast我将
melt
您的“all.data”列表,然后
dcast
将其转换为一个广泛的形式。类似于:

## Sample data
set1 <- set2 <- data.frame(sol1 = c("s1", "s1", "s1", "s1"), 
                   sol2 = c("s2", "s3", "s4", "s5"), 
                   Istat = c(0.435, 0.456, 0.845, 0.234))
set2$Istat <- set2$Istat + 1 ## Just to see some different data

all.data <- mget(ls(pattern = "set\\d+")) ## use your actual object

## The reshaping
library(reshape2)
dcast(melt(all.data, id.vars = c("sol1", "sol2")), 
      L1 + sol1 ~ sol2, value.var = "value")
#     L1 sol1    s2    s3    s4    s5
# 1 set1   s1 0.435 0.456 0.845 0.234
# 2 set2   s1 1.435 1.456 1.845 1.234
##样本数据

set1我猜要得到您显示的预期结果,应该是
sol1~sol2
。我看到我们对您的更新也有同样的想法。+1:-)@AnandaMahto您发布解决方案时,我正在更新。
library(data.table)
dcast(rbindlist(Map(cbind, all.data, group=seq_along(all.data))),
                 group + sol1 ~sol2, value.var='Istat')
all.data <- structure(list(solution1 = structure(list(sol1 = c("s1", 
"s1", 
"s1", "s1"), sol2 = c("s2", "s3", "s4", "s5"), Istat = c(0.435, 
0.456, 0.845, 0.234)), .Names = c("sol1", "sol2", "Istat"), 
class =     "data.frame", row.names = c(NA, 
-4L)), solution2 = structure(list(sol1 = c("s1", "s1", "s1", 
"s1"), sol2 = c("s2", "s3", "s4", "s5"), Istat = c(0.42, 0.536, 
0.945, 0.324)), .Names = c("sol1", "sol2", "Istat"), 
class =    "data.frame", row.names = c(NA, 
-4L))), .Names = c("solution1", "solution2"))
for (i in 1:length(all.data))
  {
  all.cast <- dcast(all.data, sol2 ~ sol1, value.var="Istat")
  }
all.cast <- list()
for (i in 1:length(all.data)) {
  all.cast[[i]] <- dcast(all.data[[i]], sol2 ~ sol1, value.var = "Istat")
}
all.cast <- lapply(all.data, dcast, sol2 ~ sol1, value.var = "Istat")
## Sample data
set1 <- set2 <- data.frame(sol1 = c("s1", "s1", "s1", "s1"), 
                   sol2 = c("s2", "s3", "s4", "s5"), 
                   Istat = c(0.435, 0.456, 0.845, 0.234))
set2$Istat <- set2$Istat + 1 ## Just to see some different data

all.data <- mget(ls(pattern = "set\\d+")) ## use your actual object

## The reshaping
library(reshape2)
dcast(melt(all.data, id.vars = c("sol1", "sol2")), 
      L1 + sol1 ~ sol2, value.var = "value")
#     L1 sol1    s2    s3    s4    s5
# 1 set1   s1 0.435 0.456 0.845 0.234
# 2 set2   s1 1.435 1.456 1.845 1.234