【发布时间】: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] = 0、a[3] = 0、...设置为零,但效率非常低且耗时。
我也尝试过a <- replace(a, a[ , grepl("a2", colnames(a))] , 0),但这会删除列名并且对元素没有任何作用。
哪些代码可以在不使用循环的情况下有效地做到这一点?
【问题讨论】:
-
您是在处理命名向量、data.frame 还是矩阵?
-
一个只包含数值的命名向量。我的真实对象的名称由三个字母加上一个数字组成,例如 (aaa1, aaa2 ...)
-
那么您应该使用
a <- setNames(10:17, paste0("a", 1:8))或类似方法制作示例数据 -
谢谢,这样效率更高。我检查了我的真实对象,它是一个 data.frame,我使用
-
有什么理由你使用
colnames(a)作为向量而不是names(a)?
标签: r