0

我有一个 txt 格式的文件,由tabs分隔,这是一个摘录:

id      1     2     4     15      18       20
1_at   100   200   89    189     299      788
2_at     8    78   33     89      90       99
3_xt   300    45   53    234      89       34
4_dx    49    34   88      8       9       15

现在我有一个文件,也是 txt 格式,并用逗号分隔以下数据:

18,1,4,20

因此,基于该文件,我想读取它并仅从第一个表格数据中提取列,以便可以存储在另一个文件中,如下所示:

(重要:我需要根据csv文件保持要存储的数据的顺序)

id      18       1     4      20
1_at   299     100    89     788
2_at    90       8    33      99
3_xt    89     300    53      34
4_dx     9      49    88      15

如果我要提取的数据是行,那会更容易,因为我可以逐行读取它并与我的 txt 文件进行比较(我已经这样做了),但我被这个列的东西困住了。

我想知道是否有任何方法可以使用某些子索引函数直接提取列?

任何帮助将不胜感激。

4

1 回答 1

2

如果您不想读取整个文件然后过滤,这是一种做您想做的事情的方法。如果您事先不知道每列的类别,这种方法也可以使用。此示例假设输入文件的列名不以数字开头,因为它在 R 中是不允许的。它也可以使用数字作为列名,但要小心,因为它可能在其他操作中失败。

> txt = 'id      1     2     4     15      18       20
+ 1_at   100   200   89    189     299      788
+ 2_at     8    78   33     89      90       99
+ 3_xt   300    45   53    234      89       34
+ 4_dx    49    34   88      8       9       15'
> 
> df <- read.table(textConnection(txt), header=T, nrows=1, check.names=F)
> 
> df
    id   1   2  4  15  18  20
1 1_at 100 200 89 189 299 788
> 
> #Lets say f is the column filter you read from other file
> f <- c("id", "18", "1", "4", "20")
> 
> f
[1] "id" "18" "1"  "4"  "20"
> 
> #Get Column Classes
> CC <- sapply(df, class)
> CC
       id         1         2         4        15        18        20 
 "factor" "integer" "integer" "integer" "integer" "integer" "integer" 
> #Specify columns that you don't want to read as "NULL" 
> CC[!names(CC) %in% f] <- "NULL"
> CC
       id         1         2         4        15        18        20 
 "factor" "integer"    "NULL" "integer"    "NULL" "integer" "integer" 
> 
> #Read whole data frame again
> df <- read.table(textConnection(txt), header=T, colClasses=CC, check.names=F)
> 
> #get columns in desired order
> df[,f]
    id  18   1  4  20
1 1_at 299 100 89 788
2 2_at  90   8 33  99
3 3_xt  89 300 53  34
4 4_dx   9  49 88  15
于 2013-02-08T16:27:01.423 回答