如何基于变量名称对数据框进行子集化

时间:2015-10-27 20:53:06

标签: r

我的数据框叫做d:

 dput(d)
structure(list(Hostname = structure(c(8L, 8L, 9L, 5L, 6L, 7L, 
1L, 2L, 3L, 4L), .Label = c("db01", "db02", "farm01", "farm02", 
"tom01", "tom02", "tom03", "web01", "web03"), class = "factor"), 
    Date = structure(c(6L, 10L, 5L, 3L, 2L, 1L, 8L, 9L, 7L, 4L
    ), .Label = c("10/5/2015 1:15", "10/5/2015 1:30", "10/5/2015 2:15", 
    "10/5/2015 4:30", "10/5/2015 8:30", "10/5/2015 8:45", "10/6/2015 8:15", 
    "10/6/2015 8:30", "9/11/2015 5:00", "9/11/2015 6:00"), class = "factor"), 
    Cpubusy = c(31L, 20L, 30L, 20L, 18L, 20L, 41L, 21L, 29L, 
    24L), UsedPercentMemory = c(99L, 98L, 95L, 99L, 99L, 99L, 
    99L, 98L, 63L, 99L)), .Names = c("Hostname", "Date", "Cpubusy", 
"UsedPercentMemory"), class = "data.frame", row.names = c(NA, 
-10L))

在一个循环中,我需要根据metrics变量来浏览这个数据框,我需要创建一个子集数据框进行汇总:

metrics<-as.vector(unique(colnames(d[,c(3:4)])))

for (m in metrics){
    sub<-dd[,c(1,m)]
}

我不能在这个子集行中使用m,任何想法如何根据变量名称对数据框进行子集化?

1 个答案:

答案 0 :(得分:1)

在您的子集调用中,您正在混合列索引和列名称,因此R无法理解您要执行的操作。

使用列名:

for (m in metrics) {
  sub <- d[, c(colnames(d)[1], m)]
}

或索引:

for (i in 3:4) {
   sub <- d[, c(1, i)]
}

话虽如此,R中的for循环通常用于需要动态赋值的情况,或用于调用具有副作用的函数或其他一些相对不常见的情况。通过在for循环中切片和切块数据来创建摘要几乎不是在R中执行此操作的正确方法。如果通常的功能工具还不够,那么可以使用plyr,dplyr等精彩的包来拆分 - 应用 - 组合你的数据以非常方便和惯用的方式。