我有一个包含九个数据帧(称为data
(的列表,每个数据帧的长度和内容各不相同。不过,它们中的大多数列都是一致的,其中包含的信息我希望存储在一个单独的数据帧中以供以后使用。这些列如下:
identifiers <- c("Organism Name", "Protein names", "Gene names", "Pathway", "Biological Process")
我想遍历data
的每个元素,检查它是否包含我感兴趣的列,然后将这些列子集作为单独的数据帧。
我第一次尝试
lapply(data, '[', identifiers]
问题是,并非所有dfs都包含上面列出的所有标识符,因此运行此操作会返回"未定义的选定列"。
我的下一次尝试是
lapply(data, function(x) if(identifiers %in% x) '[', identifiers)
其返回类别为NULL的9个(对应于9个原始数据帧(的列表。我认为这种通用方法在正确执行的情况下会起作用,但我就是想不通。
如有任何帮助,我们将不胜感激:(
由于identifiers
是列名的向量,其中一些或全部可能在每帧中,因此我们可以执行:
lapply(data, function(x) x[,intersect(names(x), identifiers),drop=FALSE])
理解一些元素可能具有零列(如果没有找到(。
您对if (identifiers %in% x)
的使用不太正确,原因有两个:
identifiers %in% x
在数据中寻找存在,而不是在名称中,它应该是identifiers %in% names(x)
;和if
正好需要一个逻辑,但identifiers %in% names(x)
将返回与identifiers
长度相同的逻辑向量(即,不是一个(。需要对其进行总结。
如果真的,如果任何的列被找到,那么你将总是所有,那么你可以将我上面的代码更改为
lapply(data, function(x) if (all(identifiers %in% names(x))) data[,identifiers])
并且没有这些列的帧将返回CCD_ 13。我上面对intersect
的使用也适用于这方面,功能上的区别在于一个帧包含一些但不是全部。由你决定你喜欢哪种逻辑。