假设
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] = 0
,a[3] = 0
,......但效率非常低且耗时。
我也尝试了a <- replace(a, a[ , grepl("a2", colnames(a))] , 0)
,但这会删除列名,并且不对元素执行任何操作。
哪些代码可以有效地执行此操作,而不使用循环?
答案 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