Как связать несколько таблиц - PullRequest
0 голосов
/ 30 августа 2018

Я хочу связать более двух таблиц вместе с rbind() в R.

Исходя из моего опыта работы с R-проблемами, я уверен, что решение легко. Но я не понимаю. Пожалуйста, смотрите этот пример данных

# create sample data
set.seed(0)
df <- data.frame(A = 0,
                 B1 = sample(c(1:3, NA), 10, replace=TRUE),
                 B2 = sample(c(1:3, NA), 10, replace=TRUE),
                 B3 = sample(c(1:3, NA), 10, replace=TRUE),
                 C = 0)

# names of relevant objects
n <- names(df)[startsWith(names(df), 'B')]

Вы видите (в n), я просто хочу использовать выбор объектов data.frame.

Нет, я создаю из них таблицы и связываю строки для получения лучшего представления.

t1 <- table(df$B1, useNA="always")
t2 <- table(df$B2, useNA="always")
t3 <- table(df$B3, useNA="always")

# this is a workaround
print( rbind(t1, t2, t3) )

Но я бы хотел упростить этот код, потому что в моих реальных данных гораздо больше таблиц, чем в трех.

Это здесь не работает

# this is what I "want" but doesn't work
print( rbind( table(df[,n])) )

# another try
do.call('rbind', list(table(df[,n])))

Где ошибка в моем мышлении?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы можете сделать:

table(stack(df[n])[2:1],useNA = 'always')[-4,]
    values
ind  1 2 3 <NA>
  B1 1 2 3    4
  B2 3 3 2    2
  B3 3 3 1    3

хорошо, если вы не хотите повернуть вспять, используя [2: 1], вы можете транспонировать:

t(table(stack(df[n]),useNA = 'always'))[-4,]
    values
ind  1 2 3 <NA>
  B1 1 2 3    4
  B2 3 3 2    2
  B3 3 3 1    3

если вы хотите использовать его в качестве data.frame:

as.data.frame.matrix(table(stack(df[n])[2:1],useNA = 'always')[-4,])
   1 2 3 NA
B1 1 2 3  4
B2 3 3 2  2
B3 3 3 1  3
0 голосов
/ 30 августа 2018

Мы можем lapply над выбранными столбцами, а затем использовать table для каждого из них и соединить их вместе, используя rbind

do.call("rbind", lapply(df[n], function(x) table(x, useNA = "always")))

#   1 2 3 <NA>
#B1 1 2 3    4
#B2 3 3 2    2
#B3 3 3 1    3

Это также можно сделать, используя apply с margin = 2 (по столбцам)

t(apply(df[n], 2, function(x) table(x, useNA = "always")))

#   1 2 3 <NA>
#B1 1 2 3    4
#B2 3 3 2    2
#B3 3 3 1    3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...