我有一个包含列组的数据框:
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
如何从汇总表中提取索引以用于创建汇总表?
答案 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