从不同的csv制作一列的列表/向量

时间:2013-12-06 15:28:31

标签: r

我已经加载了20个带有函数的csv文件:

tbl = list.files(pattern="*.csv")
for (i in 1:length(tbl)) assign(tbl[i], read.csv(tbl[i]))

它看起来如何:

> head(tbl)
[1] "F1.csv"          "F10_noS3.csv"    "F11.csv"         "F12.csv"         "F12_noS7_S8.csv"
[6] "F13.csv"

在所有这些csv文件中都有一个名为“Accession”的列。我想在每个csv文件的列中列出所有“名称”。一大列。

两个问题:

  • 其中一些“名字”是相同的,我不想复制它们
  • 其中一些“名字”几乎相同。不同的是,有名称后成为点和数字。

让我告诉你它的外观:

AT3G26450.1 <--
AT5G44520.2
AT4G24770.1
AT2G37220.2
AT3G02520.1
AT5G05270.1
AT1G32060.1
AT3G52380.1
AT2G43910.2
AT2G19760.1
AT3G26450.2 <--

<-- = 相同的样本,不同的名称。应该被视为一个。所以只需忽略点和数字。

有可能吗?

我无法做dput(head),因为它的数据集太大了。

2 个答案:

答案 0 :(得分:3)

第一个技巧:您可以使用lapply将所有表读入数据框列表。这比20个单独的数据框更容易使用。

tbl = list.files(pattern="*.csv")
list_of_data = lapply(tbl, read.csv)

第二个技巧:您可以使用do.callrbind将此列表重新组合到一个数据框中。

all_data = do.call(rbind, list_of_data)

您可以使用正则表达式选择点前Accession字段的内容。 stringr包在这里很有用。 ^表示字符串的开头,[[:alnum:]]表示字母或数字(字母数字字符),+表示一个或多个。

library(stringr)
all_data$CleanedAccession = str_extract(all_data$Accession, "^[[:alnum:]]+")

最后,您可以通过对非duplicated值进行子集化来删除重复项。

all_data = subset(all_data, !duplicated(CleanedAccession))

答案 1 :(得分:0)

如果您只需要名称列表,如果它们的格式如您的示例所示,则使用@ Richie的all_data:

names <- unique(substr(all_data$Accession,0,9))

没有正则表达式。