0

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

これで、同じく 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

ファイル全体を読み取ってからフィルタリングしたくない場合に、やりたいことを行う1つの方法です。この方法は、各列のクラスが事前にわからない場合にも機能します。この例では、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 に答える