R 保存保存在使用;由「;功能

R 保存保存在使用;由「;功能,r,csv,export-to-csv,R,Csv,Export To Csv,我使用“by”函数计算了大量图形(有4个变量)的相关矩阵,并将结果保存在数据框中,如下所示: results <- by(data, data$graphNumber, cor) 我现在想将结果保存在CSV中。我试过使用: write.table(results,"data.csv") 但这会返回一个错误: Error in as.data.frame.default(results[[i]], optional = TRUE, stringsAsFactors = stringsAs

我使用“by”函数计算了大量图形(有4个变量)的相关矩阵,并将结果保存在数据框中,如下所示:

results <- by(data, data$graphNumber, cor)
我现在想将结果保存在CSV中。我试过使用:

write.table(results,"data.csv")
但这会返回一个错误:

Error in as.data.frame.default(results[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
  cannot coerce class '"by"' into a data.frame
我可以使用以下方法编写每个矩阵:

write.table(results[1],"data.csv")
但是,我想将所有结果写入一个CSV文件,并以某种方式标识每个矩阵对应的图形


结果结构,
str(结果)


您可以使用
do.call
rbind
转换为
data.frame

resultsdf <- as.data.frame(do.call(rbind,results))

resultsdf获取
数据帧的一个选项是使用
ddply

n = 100
library(plyr)
dfx <- data.frame(
  graphNumber = c(rep('A', 8), rep('B', 15), rep('C', 6)),
  x = runif(n = 29, min = 18, max = 54),
  y = runif(n = 29, min = 18, max = 54)
)
ddply(dfx, .(graphNumber), function(x){
  cor(x[,-1])
})

 graphNumber           x           y
1           A  1.00000000  0.54914531
2           A  0.54914531  1.00000000
3           B  1.00000000 -0.02346146
4           B -0.02346146  1.00000000
5           C  1.00000000 -0.86352644
6           C -0.86352644  1.00000000
n=100
图书馆(plyr)

dfx您可以
熔化列表中的每个数据帧,然后转换为数据帧

library(reshape2)
library(plyr)

results <- by(mtcars[ , 1:4], list(am = mtcars[, "am"]), cor)
results
# am: 0
#             mpg        cyl       disp         hp
# mpg   1.0000000 -0.7959989 -0.7926335 -0.8315065
# cyl  -0.7959989  1.0000000  0.8294544  0.8454881
# disp -0.7926335  0.8294544  1.0000000  0.8343294
# hp   -0.8315065  0.8454881  0.8343294  1.0000000
# ------------------------------------------------------------------------------------------------------ 
#   am: 1
#             mpg        cyl       disp         hp
# mpg   1.0000000 -0.8259983 -0.8348954 -0.8006683
# cyl  -0.8259983  1.0000000  0.9408836  0.9004347
# disp -0.8348954  0.9408836  1.0000000  0.9240353
# hp   -0.8006683  0.9004347  0.9240353  1.0000000

results2 <- llply(results, melt)
results2
results3 <- ldply(results2)
results3

#    .id Var1 Var2      value
# 1    0  mpg  mpg  1.0000000
# 2    0  cyl  mpg -0.7959989
# 3    0 disp  mpg -0.7926335
# 4    0   hp  mpg -0.8315065
# 5    0  mpg  cyl -0.7959989
# 6    0  cyl  cyl  1.0000000
# ...
# 18   1  cyl  mpg -0.8259983
# 19   1 disp  mpg -0.8348954
# 20   1   hp  mpg -0.8006683
# 21   1  mpg  cyl -0.8259983
# 22   1  cyl  cyl  1.0000000
library(重塑2)
图书馆(plyr)

结果+1这是可行的,但结果仍然是一个矩阵,而不是一个数据框。是的,您可以将其包装并
为.data.frame
,但是如果行名重复,则会出现错误,因此需要更改这些行名。@James这是可行的,但您无法分辨每个矩阵对应的组(或图形)。我怎么能包括这个information@agstudy@Josh我已对其进行了正确编辑,这将在
行名
中提供分组信息,但同样的方法也可用于添加额外列
do.call(rbind.data.frame,…)
应该直接获得一个
数据.frame
。@Josh PS:也许你更喜欢
保存(results,file=“test.RData”)
加载(“test.RData”)
而不是类型转换。
rownames(resultsdf) <- paste(rownames(resultsdf),rep(names(results),sapply(results,nrow)), sep=".")
results <- by(mtcars[c("mpg","disp","hp")],mtcars$cyl,cor)

resultsdf
              mpg       disp         hp
mpg.4   1.0000000 -0.8052361 -0.5235034
disp.4 -0.8052361  1.0000000  0.4346051
hp.4   -0.5235034  0.4346051  1.0000000
mpg.6   1.0000000  0.1030827 -0.1270678
disp.6  0.1030827  1.0000000 -0.5136284
hp.6   -0.1270678 -0.5136284  1.0000000
mpg.8   1.0000000 -0.5197670 -0.2836357
disp.8 -0.5197670  1.0000000  0.1182556
hp.8   -0.2836357  0.1182556  1.0000000
n = 100
library(plyr)
dfx <- data.frame(
  graphNumber = c(rep('A', 8), rep('B', 15), rep('C', 6)),
  x = runif(n = 29, min = 18, max = 54),
  y = runif(n = 29, min = 18, max = 54)
)
ddply(dfx, .(graphNumber), function(x){
  cor(x[,-1])
})

 graphNumber           x           y
1           A  1.00000000  0.54914531
2           A  0.54914531  1.00000000
3           B  1.00000000 -0.02346146
4           B -0.02346146  1.00000000
5           C  1.00000000 -0.86352644
6           C -0.86352644  1.00000000
# generate sample data
n <- 1000; graphNum <- 4
data <- data.frame(x=runif(n, 1, 100), 
                   y=runif(n, 1, 100), 
                   graphNumber=gl(graphNum,n/graphNum))
(results <- by(data[,1:2], data$graphNumber, cor))

# to data frame
(df <- do.call(rbind, lapply(results, as.data.frame)))
#               x           y
# 1.x  1.00000000 -0.13468673
# 1.y -0.13468673  1.00000000
# 2.x  1.00000000 -0.04512667
# 2.y -0.04512667  1.00000000
# 3.x  1.00000000  0.03609621
# 3.y  0.03609621  1.00000000
# 4.x  1.00000000 -0.04193474
# 4.y -0.04193474  1.00000000
strsplit(row.names(df), "\\.")
library(reshape2)
library(plyr)

results <- by(mtcars[ , 1:4], list(am = mtcars[, "am"]), cor)
results
# am: 0
#             mpg        cyl       disp         hp
# mpg   1.0000000 -0.7959989 -0.7926335 -0.8315065
# cyl  -0.7959989  1.0000000  0.8294544  0.8454881
# disp -0.7926335  0.8294544  1.0000000  0.8343294
# hp   -0.8315065  0.8454881  0.8343294  1.0000000
# ------------------------------------------------------------------------------------------------------ 
#   am: 1
#             mpg        cyl       disp         hp
# mpg   1.0000000 -0.8259983 -0.8348954 -0.8006683
# cyl  -0.8259983  1.0000000  0.9408836  0.9004347
# disp -0.8348954  0.9408836  1.0000000  0.9240353
# hp   -0.8006683  0.9004347  0.9240353  1.0000000

results2 <- llply(results, melt)
results2
results3 <- ldply(results2)
results3

#    .id Var1 Var2      value
# 1    0  mpg  mpg  1.0000000
# 2    0  cyl  mpg -0.7959989
# 3    0 disp  mpg -0.7926335
# 4    0   hp  mpg -0.8315065
# 5    0  mpg  cyl -0.7959989
# 6    0  cyl  cyl  1.0000000
# ...
# 18   1  cyl  mpg -0.8259983
# 19   1 disp  mpg -0.8348954
# 20   1   hp  mpg -0.8006683
# 21   1  mpg  cyl -0.8259983
# 22   1  cyl  cyl  1.0000000