Используйте список индексов подмножеств в цикле for или функции - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть фрейм данных, содержащий группы столбцов:

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 в аг.Таблица.Это неправильно индексирует:

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 голосов
/ 12 декабря 2018

Мы можем сделать split в list и затем получить table

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

Если нам нужен цикл for, мы инициализируем unique names набора данных ('un1'), создайте пустое значение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...