2013-02-08 169 views
0

我有一个文件,该文件是txt格式,并通过标签分隔的,下面是摘录:如何删除并保留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 

现在我有一个文件,也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文件比较(我已经完成),但我坚持使用这个列的东西。

我不知道是否有任何方式使用一些分类指数函数来提取,直接列?

任何帮助将不胜感激。

+0

[你有什么试过?](http://whathaveyoutried.com) – 2013-02-08 15:50:50

+1

列名不能以数字开头。 – 2013-02-08 15:53:13

+0

@Jack梅尼我有一个类似的问题是什么,我想提取的事情是从行,所以我用了两个回路一个读取TXT文件,另一个是读取表格格式。依次进行比较,当数据与我存储在另一个文件中时匹配。有了这些东西我不知道我该怎么做。也许只有先调换数据一样,如果其行,然后再次转置对待它,但该文件是巨大的,所以我不认为这是一个很好的解决方案 – Layla 2013-02-08 15:55:46

回答

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 
+0

谢谢,但如果数据是在一个文件中,我不能使用read.table,我该如何处理? – Layla 2013-02-08 16:59:10

+0

参见'read.table'。 'read.table'可以利用文件名输入 – 2013-02-08 17:00:16

+0

@Manuel如果您满意的答案千万要记得将其标记为接受 – 2013-02-08 17:22:51

相关问题