повторение таблицы () приводит к матрице / фрейму данных - PullRequest
1 голос
/ 27 марта 2020

Это должно быть просто, но я бьюсь головой об это некоторое время. Пожалуйста помоги. У меня есть большой набор данных, из которого я получаю все виды информации через table (). Затем я хочу сохранить эти подсчеты с именами строк, которые были подсчитаны. Для воспроизводимого примера рассмотрим

a <- c("a", "b", "c", "d", "a", "b")  # one count, occurring twice for a and 
                                      # b and once for c and d 
b <- c("a", "c")  # a completly different property from the dataset 
                  # occurring once for a and c
x <- table(a)
y <- table(b)  # so now x and y hold the information I seek

Как мне слить / связать / что-нибудь, чтобы получить из x и y в эту форму:

   x. y.
a  2. 1
b  2. 0
c  1. 1
d. 1  0

ОДНАКО, мне нужно использовать решение для работать итеративно, в al oop, который принимает x и y и получает запрошенную форму выше, а затем добавляет дополнительные таблицы, каждая из которых, надеюсь, добавляет столбец. Одна из моих многочисленных неудачных попыток, просто чтобы показать мои (вероятно, ошибочные) логи c, такова:

member <- function (data = dfm, groupvar = 'group', analysis = kc15) {
  res<-matrix(NA,ncol=length(analysis$size)+1) #preparing an object for the results
  res[,1]<-table(docvars(data,groupvar)) #getting names and totals of groups
  for (i in 1:length(analysis$size)) { #getting a bunch of counts that I care about
    r<-table(docvars(data,groupvar)[analysis$cluster==i])
    res<-cbind(res,r) #here's the problem, trying to add each new count as a column.
  }
  res
}

Итак, подведя итог, приведенный выше воспроизводимый пример означает, что реплицируется первый столбец в res и r, и я ищу (я думаю) правильное решение вместо cbind, которое позволило бы добавлять столбцы различной длины, но с похожими именами, как в примере выше. Пожалуйста, помогите мне смущать, сколько времени я трачу на это

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Следующим может быть параметр, который объединяет «имена строк» ​​фреймов данных, преобразованные из таблиц частот:

df <- merge(as.data.frame(x, row.names=1, responseName ="x"), 
            as.data.frame(y, row.names=1, responseName ="y"), 
         by="row.names", all=TRUE)
df[is.na(df)] <- 0; df

  Row.names x y
1         a 2 1
2         b 2 0
3         c 1 1
4         d 1 0

Затем этот метод может быть включен в ваш реальные данные с некоторыми изменениями. Я составил данные, так как мне не с чем было работать.

set.seed(1234)
groupvar <- sample(letters[1:4], 16, TRUE)
clusters <- 1:4
cluster <- rep(clusters, each=4)

Объедините первые две таблицы:

res <- merge(as.data.frame(table(groupvar[cluster==1]),
                           row.names=1, responseName=clusters[1]),
             as.data.frame(table(groupvar[cluster==2]),
                           row.names=1, responseName=clusters[2]),
             by="row.names", all=TRUE)

Затем объедините остальные, используя вашу для l oop.

for (i in 3:length(clusters)) { 
  r <- table(groupvar[cluster==i])
  res <- merge(res, as.data.frame(r, row.names=1, responseName = clusters[i]), 
               by.x="Row.names", by.y="row.names", all=TRUE)
}
res[is.na(res)] <- 0

res
  Row.names X1 X2 X3 X4
1         a  1  2  0  0
2         b  1  1  2  2
3         c  0  1  1  2
4         d  2  0  1  0
1 голос
/ 27 марта 2020

merge t транспонирован и транспонирован.

res <- t(merge(t(unclass(x)), t(unclass(y)), all=TRUE))
res <- `colnames<-`(res[order(rownames(res)), 2:1], c("x", "y"))
res[is.na(res)] <- 0
res
#   x y
# a 2 1
# b 2 0
# c 1 1
# d 1 0
...