我的数据看起来像这样
id var1 var1_a var2 var2_a var3 var3_a
1 1 7 7 8 9 4
2 2 4 8 7 6 5
3 5 5 1 2 3 4
4 6 9 5 6 7 8
我只选择var1,var2和var3,并排除var1_a,var2_a和var3_a。变量名称的长度可能会有所不同
我知道我可以使用
dt.m<-melt(dt, id=1, measure.vars=c(1, 3, 5), na.rm=TRUE)
但是我不想使用这种方法,因为我有太多的变量。
如何使用模式或类似方法来做到这一点?
答案 0 :(得分:2)
如果小节列名称具有模式,则使用grep
查找它们。在示例中,所有感兴趣的变量都以数字结尾,因此我们可以使用以下代码:
melt(dt, id = 1, measure = grep("\\d$", names(dt)), na.rm = TRUE)
或者如果感兴趣的列在可预测的位置,则使用seq
或类似的方法来生成列号。
melt(dt, id = 1, measure = seq(2, 6, 2), na.rm = TRUE)
其他选择示例中可用名称的方法是:
# pick out column names that have 4 characters
which(nchar(names(dt)) == 4)
# pick out names having no underscore and that are not first
grep("_", names(dt), invert = TRUE)[-1]
# pick out even positions
which( (1:ncol(dt)) %% 2 == 0)
答案 1 :(得分:1)
对不起,我会发表评论,但我的代表还不够。如果您的变量实际上被命名为var1 var1_a等,则可以使用gsub
names1 = paste0("var",seq(1,100))
names2 = paste0("var",seq(1,100),"_a")
names = sample(c(names1, names2))
x = matrix(rnorm(200*10),nrow=10)
d = data.frame(x)
names(d) = names
d.m <- d[,which(gsub("_a","",names(d)) == names(d))]
print(names(d.m))