提取单个列

时间:2014-06-22 14:08:34

标签: r list

我列出了701个csv文件。每个列具有相同数量的列(7)但行数不同(在25000和28000之间)。

以下是第一个文件的摘录:

Date,Week,Week Day,Hour,Price,Volume,Sale/Purchase
18/03/2011,11,5,1,-3000.00,17416,Sell
18/03/2011,11,5,1,-1001.10,17427,Sell
18/03/2011,11,5,1,-1000.00,18055,Sell
18/03/2011,11,5,1,-500.10,18057,Sell
18/03/2011,11,5,1,-500.00,18064,Sell
18/03/2011,11,5,1,-400.10,18066,Sell
18/03/2011,11,5,1,-400.00,18066,Sell
18/03/2011,11,5,1,-300.10,18068,Sell
18/03/2011,11,5,1,-300.00,18118,Sell

我对2012年第9小时的供给曲线进行了非线性回归。2012年的数据是290.到654. csv文件。

allenamen <- dir(pattern="*.csv")
alledat <- lapply(allenamen, read.csv, header = TRUE, sep = ",", stringsAsFactors = FALSE)
h <- list()
for(i in 290:654) {
g <- function(a, b, c, d, p) {a*atan(b*p+c)+d}
f <- nlsLM(Volume ~ g(a,b,c,d,Price), data=subset(alledat[[i-289]], (Hour==9) & (Sale.Purchase == "Sell") & (!Price %in% as.character(-50:150))), start = list(a=4000, b=0.1, c=-5, d=32000))
h[[i-289]] <- coef(f)
}

这很有效,我得到了2012年每天的系数a,b,c和d。

这是head(h)

[[1]]
        a             b             c             d 
2.513378e+03  4.668218e-02 -3.181322e+00  2.637142e+04 

[[2]]
        a             b             c             d 
2.803172e+03  6.696201e-02 -4.576432e+00  2.574454e+04 

[[3]]
        a             b             c             d 
 3.298991e+03  5.817949e-02 -3.425728e+00  2.393888e+04 

[[4]]
        a             b             c             d 
 2.150487e+03  3.810406e-02 -2.658772e+00  2.675609e+04 

[[5]]
        a             b             c             d 
2.326199e+03  3.044967e-02 -1.780965e+00  2.604374e+04 

[[6]]
        a             b             c             d 
2934.0193270     0.0302937    -1.9912913 26283.0300823

这是dput(head(h))

list(structure(c(2513.37818972349, 0.0466821822063123, -3.18132213466142, 
26371.4241646124), .Names = c("a", "b", "c", "d")), structure(c(2803.17230054557, 
0.0669620116294894, -4.57643230249848, 25744.5376725213), .Names = c("a", 
"b", "c", "d")), structure(c(3298.99066895304, 0.0581794881246528, 
-3.42572804902504, 23938.8754575156), .Names = c("a", "b", "c", 
"d")), structure(c(2150.48734655237, 0.0381040636898022, -2.65877160023262, 
26756.0907073567), .Names = c("a", "b", "c", "d")), structure(c(2326.19873555633, 
0.0304496684589379, -1.7809654498454, 26043.735374657), .Names = c("a", 
"b", "c", "d")), structure(c(2934.01932702805, 0.0302937043170001, 
-1.99129130343521, 26283.0300823458), .Names = c("a", "b", "c", 
"d")))

现在我正在尝试使用h$a获取一个列,但我得到NULL。我怎样才能得到一个专栏?

除此之外,我想绘制单个系数和Date。我试过这段代码:

koeffreihe <- function(x) {
files <- list.files(pattern="*.csv")    
df <- data.frame()  
for(i in 1:length(files)){
xx <- read.csv(as.character(files[i]))    
xx <- subset(xx, Sale.Purchase == "Sell" & Hour == 3)
df <- rbind(df, xx)
g <- function(a, b, c, d, p) {a*atan(b*p+c)+d}
f <- nlsLM(Volume ~ g(a,b,c,d,Price), data=subset(alledat[[i]], (Hour==9) & (Sale.Purchase == "Sell") & (!Price %in% as.character(-50:150))), start = list(a=4000, b=0.1, c=-5, d=32000))
h[[i]] <- coef(f)  
}
df$Date <- as.Date(as.character(df$Date), format="%d/%m/%Y")
plot(h$x ~ Date, df, xlim = as.Date(c("2012-01-01", "2012-12-31")))
}

koeffreihe(a)

但是我收到了这个错误:

invalid type (NULL) for variable 'h$x'

所以问题是h$a为NULL。如果有人可以解决这个问题,我想代码也会起作用。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

首先将您的列表转换为data.frame:

h.df <- setNames(do.call(rbind.data.frame, h), names(h[[1]]))
#         a          b         c        d
#1 2513.378 0.04668218 -3.181322 26371.42
#2 2803.172 0.06696201 -4.576432 25744.54
#3 3298.991 0.05817949 -3.425728 23938.88
#4 2150.487 0.03810406 -2.658772 26756.09
#5 2326.199 0.03044967 -1.780965 26043.74
#6 2934.019 0.03029370 -1.991291 26283.03

然后您可以轻松地提取变量:

h.df$a
#[1] 2513.378 2803.172 3298.991 2150.487 2326.199 2934.019

或者,您可以遍历列表以提取变量:

sapply(h, "[", "a")
#       a        a        a        a        a        a 
#2513.378 2803.172 3298.991 2150.487 2326.199 2934.019 

答案 1 :(得分:0)

在这一行中,虽然x是变量,但h$x正在x中寻找名为h的列:

plot(h$x ~ Date, df, xlim = as.Date(c("2012-01-01", "2012-12-31")))

您可能需要h[[x]]

来自?'[['

x$name is equivalent to x[["name", exact = FALSE]].

也就是说,您正在寻找一个名为x的列。