R 从不同csv生成一列的列表/向量
我已经加载了20个csv文件,功能如下:R 从不同csv生成一列的列表/向量,r,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" 在所有
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文件中都有一个名为“加入”的列。我想从每个csv文件中列出这些列中的所有“名称”。一张大单子
两个问题:
- 有些“名字”是相同的,我不想重复它们
- 有些“名字”几乎是一样的。区别在于有名字和后面变成点和数字李>
AT3G26450.1 <--
AT5G44520.2
AT4G24770.1
AT2G37220.2
AT3G02520.1
AT5G05270.1
AT1G32060.1
AT3G52380.1
AT2G43910.2
AT2G19760.1
AT3G26450.2 <--
AT3G26450.1第一个技巧:您可以使用lappy
将所有表格读入数据帧列表。这比使用20个单独的数据帧更容易
tbl = list.files(pattern="*.csv")
list_of_data = lapply(tbl, read.csv)
第二个技巧:您可以使用do.call
和rbind
将此列表重新组合到单个数据帧中
all_data = do.call(rbind, list_of_data)
您可以使用正则表达式选择点前面的加入
字段的内容。stringr
包在这里很有用^
表示字符串的开头,[:alnum:]
表示字母或数字(字母数字字符),+
表示一个或多个
library(stringr)
all_data$CleanedAccession = str_extract(all_data$Accession, "^[[:alnum:]]+")
最后,您可以通过对非重复的
值进行子集设置来删除重复项
all_data = subset(all_data, !duplicated(CleanedAccession))
如果您只需要名称列表,并且它们的格式与您的示例相同,则使用@Richie的all_数据:
names <- unique(substr(all_data$Accession,0,9))
命名代码看起来不错,但问题是我不能使用rbind,因为每个csv文件中的列/行数不同。有什么解决办法吗?@Rechlay:如果每个表的内容都代表同一类内容,那么您应该将它们组合起来。(您可以添加虚拟字段以使列匹配。)另一方面,如果它们表示不同的内容,则最好将它们保留为数据帧列表。您可以使用lappy
在列表上循环并更新每个数据帧。