r-如何使用lapply从数据帧列表中提取特定列



我有一个包含九个数据帧(称为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)的使用不太正确,原因有两个:

  1. identifiers %in% x在数据中寻找存在,而不是在名称中,它应该是identifiers %in% names(x);和

  2. if正好需要一个逻辑,但identifiers %in% names(x)将返回与identifiers长度相同的逻辑向量(即,不是一个(。需要对其进行总结。

如果真的,如果任何的列被找到,那么你将总是所有,那么你可以将我上面的代码更改为

lapply(data, function(x) if (all(identifiers %in% names(x))) data[,identifiers])

并且没有这些列的帧将返回CCD_ 13。我上面对intersect的使用也适用于这方面,功能上的区别在于一个帧包含一些但不是全部。由你决定你喜欢哪种逻辑。

最新更新