在for循环或函数中使用子集索引列表

时间:2018-12-11 22:35:57

标签: r

我有一个包含列组的数据框:

dataTab<-as.data.frame(matrix(data=NA, nrow=3, ncol=4))
names(dataTab)<-c("a1", "a2","b1","b2")
dataTab$a1<-c("d", "e", "f")
dataTab$a2<-c("d", "e", "g")
dataTab$b1<-c("h", "i", "j")
dataTab$b2<-c("i", "j", "k")

我手动建立一个汇总表,该表描述了我希望如何汇总数据帧。该表包含组合的组名,以及与每个组关联的列的索引。

agTab<-as.data.frame(matrix(data=NA, nrow=2, ncol=2))
names(agTab)<-c("Grp_Name", "Index")
agTab$Grp_Name<-c("a", "b")
agTab$Index<-c("1:2","3:4")

如何从聚合表中提取索引值以按组循环创建摘要表?

在我的第一种方法中,我使用cat删除索引周围的引号,因为该引号存储为character在ag中。表。这不能正确索引:

for (row in 1:nrow(agTab)){
  Ind<-cat(c(agTab[row,2]))
  print(Ind)
  sumTab<-as.data.frame(table(unlist(dataTab[,Ind])))
  print(sumTab)}

结果:

1:2NULL
[1] Freq
<0 rows> (or 0-length row.names)
3:4NULL
[1] Freq
<0 rows> (or 0-length row.names)

我不确定R视为索引值,但是“ NULL”绝对不正确。

但是,当我手动输入索引时,我得到了预期的结果:

sumTab<-as.data.frame(table(unlist(dataTab[,1:2])))

  Var1 Freq
1    d    2
2    e    2
3    f    1
4    g    1

sumTab<-as.data.frame(table(unlist(dataTab[,3:4])))
sumTab

  Var1 Freq
1    h    1
2    i    2
3    j    2
4    k    1

如何从汇总表中提取索引以用于创建汇总表?

1 个答案:

答案 0 :(得分:1)

我们可以将split变成list,然后得到table

lapply(split.default(dataTab, gsub("\\d+", '', names(dataTab))), 
        function(x) as.data.frame(table(unlist(x))))

如果我们需要一个for循环,则初始化数据集('un1')的unique names,创建一个空白list来将输出存储在每个{循环('lst1'),循环浏览'un1'的序列,对数据集进行子集化,获取table输出,并将其分配给输出list元素

un1 <- unique(gsub("\\d+", "", names(dataTab)))
lst1 <- vector('list', length(un1))
for(i in seq_along(un1)) {
    tmp <- dataTab[grep(paste0(un1[i], "\\d+"), names(dataTab))]
    lst1[[i]] <- as.data.frame(table(unlist(tmp)))
 }

如果要提取索引

lst2 <- vector('list', nrow(agTab))
for(i in seq_along(agTab$Index)) {
  ind <- eval(parse(text=agTab$Index[i]))
   print(ind)
   lst[[i]] <- ind
 }
#[1] 1 2
#[1] 3 4