选择以其名称为条件的向量元素,将所有其他元素替换为零

时间:2018-03-12 11:07:37

标签: r

假设

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 <- replace(a, a[ , grepl("a2", colnames(a))] , 0),但这会删除列名,并且不对元素执行任何操作。

哪些代码可以有效地执行此操作,而不使用循环?

1 个答案:

答案 0 :(得分:1)

制作命名的矢量/矩阵 使用colnames()代替names()进行单行&#39; - 虽然如果它只是一个命名向量,我会使用names()

我们假设您要选择&#39; a2&#39;和&#39; a4&#39;仅

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

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

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

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