根据图案和融化排除变量

时间:2019-10-24 22:29:41

标签: r data.table

我的数据看起来像这样

   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)

但是我不想使用这种方法,因为我有太多的变量。

如何使用模式或类似方法来做到这一点?

2 个答案:

答案 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))