【问题标题】:How to get all columns with the same column name in R at once?如何一次获取R中具有相同列名的所有列?
【发布时间】:2019-09-23 09:34:34
【问题描述】:

假设我有以下数据框:

> 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”的所有列,并在单个命令中将它们放入新数据框中?在我的真实数据中,我有很多列具有重复的列名,而且我不知道列的索引,所以我无法通过数字获取它们。

【问题讨论】:

  • 你想要这样的东西吗? test[,grepl("test", colnames(test)) ].

标签: r


【解决方案1】:

出于实际原因,不建议使用相同的列名。但是,我们可以做一个比较(==)来得到一个逻辑向量并用它来提取列

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])

【讨论】:

  • 谢谢,这是我需要的解释
猜你喜欢
  • 2017-01-14
  • 2021-01-14
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多