【问题标题】:Selecting elements of a vector conditional on their names, replacing all others with zero以名称为条件选择向量的元素,用零替换所有其他元素
【发布时间】:2018-03-12 11:07:37
【问题描述】:

假设

a <- c(10 : 17)
names(a) <- c("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8")
a <- as.data.frame(a)

给出向量(或 [1 , 1:8] 矩阵)

a1 a2 a3 a4 a5 a6 a7 a8 
10 11 12 13 14 15 16 17 

我想根据列名选择元素并将所有其他元素替换为零。

例如,选择“a2”和“a4”会给出

a1 a2 a3 a4 a5 a6 a7 a8 
 0 11  0 13  0  0  0  0 

一种解决方案是选择每个元素并将a[1] = 0a[3] = 0、...设置为零,但效率非常低且耗时。

我也尝试过a &lt;- replace(a, a[ , grepl("a2", colnames(a))] , 0),但这会删除列名并且对元素没有任何作用。

哪些代码可以在不使用循环的情况下有效地做到这一点?

【问题讨论】:

  • 您是在处理命名向量、data.frame 还是矩阵?
  • 一个只包含数值的命名向量。我的真实对象的名称由三个字母加上一个数字组成,例如 (aaa1, aaa2 ...)
  • 那么您应该使用a &lt;- setNames(10:17, paste0("a", 1:8)) 或类似方法制作示例数据
  • 谢谢,这样效率更高。我检查了我的真实对象,它是一个 data.frame,我使用
  • 有什么理由你使用colnames(a)作为向量而不是names(a)

标签: r


【解决方案1】:

制作命名向量/矩阵 使用colnames() 而不是names() 用于单个“行” - 尽管如果它只是一个命名向量,我会使用names()

假设您只想选择“a2”和“a4”。

sel <- c("a2", "a4")

a[,!colnames(a) %in% sel] <- 0
a

这是有效的,因为我们正在选择列 - 从 1 行的矩阵中。 我们可以使用列名来对列进行子集化。

> a
     a1 a2 a3 a4 a5 a6 a7 a8
[1,]  0 11  0 13  0  0  0  0

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多