1

我正在尝试使用 R 来根据需要接受尽可能多的用户输入文件,并获取这些文件并为每个文件制作一个直方图,该直方图存储在第 14 列中的值。我已经做到了这一点:

library("tcltk")
library("grid")
File.names<-(tk_choose.files(default="", caption="Choose your files", multi=TRUE, filters=NULL, index=1))
Num.Files<-NROW(File.names)
test<-sapply(1:Num.Files,function(x){readLines(File.names[x])})
data<-read.table(header=TRUE,text=test[1])
names(data)[14]<-'column14'
dat <- list(file1 = data.frame("column14"),
            file2 = data.frame("column14"),
            file3 = data.frame("column14"),
            file4 = data.frame("column14"))
#Where the error comes up
tmp <- lapply(dat, `[[`, 2)
lapply(tmp, function(x) {hist(x, probability=TRUE, main=paste("Histogram of Coverage")); invisible()})
layout(1)

我的代码挂断了,虽然在声明tmp <- lapply(dat,[[, 2) 出现的错误是两件事之一。如果该行如上所示,则错误是:

Error in .subset2(x, i, exact = exact) : subscript out of bounds
Calls: lapply -> FUN -> [[.data.frame -> <Anonymous>

我做了一些研究,发现它可能是由双 [[]] 引起的,所以我将其更改为tmp <- lapply(dat,[, 2)以查看它是否有任何好处(正如许多教程所说的那样),但这只是导致了这个错误:

Error in `[.data.frame`(X[[1L]], ...) : undefined columns selected
Calls: lapply -> FUN -> [.data.frame

输入文件都将遵循以下模式:

Targ  cov  av_cov  87A_cvg  87Ag  87Agr  87Agr  87A_gra  87A%_1   87A%_3   87A%_5   87A%_10  87A%_20  87A%_30 87A%_40   87A%_50 87A%_75 87A%_100
1:028 400   0.42    400 0.42    1   1   2   41.8    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1:296 400   0.42    400 0.42    1   1   2   41.8    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

这是个常见的问题吗?谁能给我解释一下?我对R不太熟悉,但我希望继续学习。谢谢编辑:为了重现性,如果我运行:

head(test)
head(data)
x <- list(mtcars, mtcars, mtcars);lapply(x, head)
head(dat)

这是结果:

   > head(test)
     [,1]                                                                                                                                               
[1,] "Targ  cov  av_cov  87A_cvg  87Ag  87Agr  87Agr  87A_gra  87A%_1   87A%_3   87A%_5   87A%_10  87A%_20  87A%_30 87A%_40\t87A%_50\t87A%_75\t87A%_100"
[2,] "1:028 400\t0.42\t400\t0.42\t1\t1\t2\t41.8\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"                                                           
[3,] "1:296 400\t0.42\t400\t0.42\t1\t1\t2\t41.8\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"                                                           
[4,] "1:453 1646\t8.11\t1646\t8.11\t7\t8\t13\t100.0\t100.0\t87.2\t32.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"                                                   
[5,] "1:427 1646\t8.11\t1646\t8.11\t7\t8\t13\t100.0\t100.0\t87.2\t32.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0"                                                   
[6,] "1:736 5105\t29.68\t5105\t29.68\t14\t29\t48\t100.0\t100.0\t100.0\t86.0\t65.7\t49.4\t35.5\t16.9\t0.0\t0.0"                                          
> head(data)
 [1] Targ      cov       av_cov    X87A_cvg  X87Ag     X87Agr    X87Agr.1 
 [8] X87A_gra  X87A._1   X87A._3   X87A._5   X87A._10  X87A._20  X87A._30 
[15] X87A._40  X87A._50  X87A._75  X87A._100
<0 rows> (or 0-length row.names)
> x <- list(mtcars, mtcars, mtcars);lapply(x, head)
[[1]]
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

[[2]]
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

[[3]]
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

> head(dat)
$file1
  X.column14.
1    column14

$file2
  X.column14.
1    column14

$file3
  X.column14.
1    column14

$file4
  X.column14.
1    column14

> tmp <- lapply(dat, `[`, 2)
Error in `[.data.frame`(X[[1L]], ...) : undefined columns selected
Calls: lapply -> FUN -> [.data.frame
Execution halted
4

1 回答 1

1

你想在这里做什么?

tmp <- lapply(dat, `[[`, 2)

lapply 函数等价于

list(file1=dat[[1]][[2]],
     file2=dat[[2]][[2]],
     file3=dat[[3]][[2]],
     file4=dat[[4]][[2]])

这行不通。您正在尝试从只有 1 列的数据框中提取第 2 列。

将 dat 重新定义为这样,它将起作用。

dat <- list(file1 = data.frame("column14","iforgotcolumn2"),
            file2 = data.frame("column14","iforgotcolumn2"),
            file3 = data.frame("column14","iforgotcolumn2"),
            file4 = data.frame("column14","iforgotcolumn2"))
于 2012-08-13T21:49:27.700 回答