如何一次在R中获得具有相同列名的所有列?

时间:2019-09-23 01:23:07

标签: r

假设我有以下数据框:

> test <- cbind(test=c(1, 2, 3), test=c(1, 2, 3))
> test
     test test
[1,]    1    1
[2,]    2    2
[3,]    3    3

现在,我要从这样的数据框中获取所有名为“ test”的列到一个新的数据框中:

> new_df <- test[, "test"]

但是,这最后一次尝试仅获取测试数据帧中称为“ test”的第一列:

> new_df
[1] 1 2 3

在该示例中,如何获取所有称为“ test”的列,并将它们放入单个命令中的新数据框中?在我的真实数据中,我有很多列具有重复的姓,并且我不知道列的索引,所以我无法按数字获取它们。

1 个答案:

答案 0 :(得分:2)

出于实际原因,建议不要使用相同的列名。但是,我们可以进行比较(==以获取逻辑向量,并使用该向量来提取列

i1 <- colnames(test) == "test"
new_df <- test[, i1, drop = FALSE]

请注意,data.frame不允许重复的列名,可以通过在末尾附加.1等附加.2 make.unique等来将其更改为唯一。使用matrix(OP的数据集),允许具有重复的列名或行名(虽然不建议)


此外,如果有多个重复的列名并希望将它们选择为单独的数据集,请使用split

lst1 <- lapply(split(seq_len(ncol(test)), colnames(test)), function(i)
            test[, i, drop = FALSE])

或遍历unique列名,并通过==遍历lapply

lst2 <- lapply(unique(colnames(test)), function(nm) 
             test[, colnames(test) == nm, drop = FALSE])