首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中整形包中循环dcast函数的实现

R中整形包中循环dcast函数的实现
EN

Stack Overflow用户
提问于 2015-04-30 05:09:58
回答 3查看 1.1K关注 0票数 3

作为一个相对较新的R用户,我在任何循环功能上都有问题。我看过许多教程,但它们中的示例通常是非常基本的,因此易于执行。然而,我需要创建稍微复杂的循环,并且在弄清楚如何做到这一点上遇到了很多困难。有一些相关的循环问题在这里和其他论坛上,但没有完全符合我的需要,虽然我已经尝试适应其他的答案,我目前的问题,我不断地遇到错误。

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

代码语言:javascript
复制
solution1    
> sol1     sol2     Istat
> s1       s2       0.435
> s1       s3       0.456
> s1       s4       0.845
> s1       s5       0.234

它基本上是对我所拥有的2000种独立解决方案的两两比较的总结,以及以“Istat”值概括的解决方案之间的相似性。

我正在尝试将这些2000 .csv文件中的每一个转换为宽格式表(使用R中的reshape包),因此它们看起来类似于(下面的示例):

代码语言:javascript
复制
     s1     s2     s3     s4     s5
s1   NA     0.435  0.456  0.845  0.234

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

代码语言:javascript
复制
stat.cast <- dcast(solution1, sol2 ~ sol1, value.var="Istat")

但我似乎无法将其转化为for循环函数,甚至不能使用lapply,这似乎也是一个可能的解决方案。

使用for函数所能得到的最接近的:

代码语言:javascript
复制
 # 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")
  }

但是它一直给我一个错误,即它无法从输入中识别"Istat“值--尽管它在我拥有的数据列表中(上面代码中的”解决方案“对象)。

并使用lapply函数:

代码语言:javascript
复制
lapply(solutions, dcast(all.data, sol2 ~ sol1, value.var="Istat"))

我得到了相同类型的错误:

代码语言:javascript
复制
Error: value.var (Istat) not found in input

我不明白为什么,因为它被列在数据文件列表中,作为每个2000数据文件中的一个变量。我似乎没有让它正确地遍历我的每个2000 .csv文件,但我不知道如何修复它。我还在想,是否也可以编写代码,以便按照列名将所有2000输出循环起来?这太疯狂了。

我希望这不是我所认为的那样复杂的问题。任何帮助(连同一些详细的解释)或有用的方向,都将受到广泛和真诚的感谢。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-30 05:28:20

我会melt你的"all.data“列表,然后把它写成一个宽格式。类似于:

代码语言:javascript
复制
## 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

如果您的"all.data“对象有名称,"L1”将反映这些名称,从长远来看,这是相当方便的。

票数 2
EN

Stack Overflow用户

发布于 2015-04-30 05:16:32

你写道:

代码语言:javascript
复制
for (i in 1:length(all.data))
  {
  all.cast <- dcast(all.data, sol2 ~ sol1, value.var="Istat")
  }

你应该写的是:

代码语言:javascript
复制
all.cast <- list()
for (i in 1:length(all.data)) {
  all.cast[[i]] <- dcast(all.data[[i]], sol2 ~ sol1, value.var = "Istat")
}

但一个更"R-esque“的解决方案是:

代码语言:javascript
复制
all.cast <- lapply(all.data, dcast, sol2 ~ sol1, value.var = "Istat")

希望这能说明你做错了什么。

票数 5
EN

Stack Overflow用户

发布于 2015-04-30 05:15:43

"all.data“是一组数据格式。要循环列表,可以使用lapply和匿名函数调用(只是为了清楚起见),并对其应用dcast

代码语言:javascript
复制
library(reshape2)
lapply(all.data, function(x) dcast(x, sol1 ~ sol2, value.var="Istat"))

或者不执行单独的dcast,列表可以是对每个列表元素使用分组变量的数据文件的rbind,然后从library(tidyr)执行dcastspread

代码语言:javascript
复制
library(dplyr)
library(tidyr)
unnest(all.data, group) %>% 
                  spread(sol2, Istat)

或者使用data.table

代码语言:javascript
复制
library(data.table)
dcast(rbindlist(Map(cbind, all.data, group=seq_along(all.data))),
                 group + sol1 ~sol2, value.var='Istat')

数据

代码语言:javascript
复制
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"))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29959450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档