2015-10-01 3 views
1

ОБНОВЛЕНОКомбинирование таблицы В R

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

У меня есть две таблицы из обзора, касающиеся того, как различные политические партии и деловые люди думают о политической проблеме. Они поступают из двух разных наборов данных, которые я не хочу сливать (по разным причинам). Каждая информация имеет одинаковые имена для значений. Но, когда я использовал cbind для объединения столбцов, строки обращаются к некоторым столбцам, и я не могу понять, почему.

Мои данные

library(survey) 
founders.services <- 
structure(c(38, 43, 131, 172, 177, 122, 34, 12, 114, 70, 17, 
27), .Dim = c(2L, 6L), .Dimnames = structure(list(services = c("compete", 
"similar"), party = c("skipped", "Democrat", "Independent", "Libertarian", 
"Republican", "other")), .Names = c("services", "party"))) 

public.services.party <- 
structure(c(26, 103), .Dim = 2L, .Dimnames = structure(list(services = c("similar", 
"compete")), .Names = "services"), class = c("svytable", "xtabs", 
"table"), call = svytable.survey.design(formula = ~services, 
    design = fss)) 

И, как я совмещаю их:

cbind(founders.services, public.services.party) 

В первом (и правильно) таблицу, в колонке "либертарианский", строка "соревнуются" имеет значение 34 и «аналогичное» имеет 12. Но в комбинированной таблице (с cbind) это наоборот. Если имена были разными, они должны отображаться как разные столбцы. Но, cbind, похоже, признает, что они оба одинаковы.

Почему это происходит?

И, в более общем плане, если есть лучший способ объединить таблицы, я с удовольствием рассмотрю альтернативы. В основном, у меня есть несколько разных наборов данных, на которые отвечали одни и те же вопросы различные группы населения (политическая партия, бизнес-тип). Я не могу объединить наборы данных, но хотел бы объединить таблицы для анализа.

Спасибо, и, пожалуйста, дайте мне знать, если я могу сделать этот вопрос более ясным.

ОБНОВЛЕНО: с кодом и таблицами.

Вот правильная таблица

services skipped Democrat Independent Libertarian Republican other 
    compete  38  131   177   34  114 17 
    similar  43  172   122   12   70 27 

Здесь комбинированный стол с ошибкой. вам понадобится пакет «опрос» для репликации.

 founders.services skipped Democrat Independent Libertarian Republican other 
similar    26  38  131   177   34  114 17 
compete    103  43  172   122   12   70 27 
+0

Если вы используете пакет, пожалуйста, бросьте 'библиотека (my_needed_package)' строки в код. – Frank

+0

Вы можете сделать это более ясным, добавив вывод, который вы получаете от cbind, и ожидаемый результат. В моем случае я прокомментировал вашу функцию svytable и попробовал ее, и не видел описанного вами поведения - я думаю ... не уверен, потому что я мог бы неправильно интерпретировать ваш текст. –

+0

ОК спасибо! @Frank я добавил, что вам нужен пакет опроса R (я сделал это правильно?) – tom

ответ

2

Он принимает имена строк из первого кадра данных, который вы ввели в команду cbind. Если вы только обратный порядок cbind, вы получите то, что вы хотите:

> cbind(public.services.party,founders.services) 
     skipped Democrat Independent Libertarian Republican other founders.services 
compete  38  131   177   34  114 17    26 
similar  43  172   122   12   70 27    103 

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

+1

Это имеет смысл. Как общее замечание, 'rownames' являются грязными. Нашел это резюме через google: http://www.perfectlyrandom.org/2015/06/16/never-trust-the-row-names-of-a-dataframe-in-R/ – Frank

+0

Было интересно, как объединить их, используя имена строк, но сразу не могли придумать способ, затем мне пришло в голову попробовать его вспять. Мой R немного ржавый, был pythoning и hiving ... –

+0

Спасибо! Есть ли лучший способ объединить таблицы? иногда я объединяю более двух таблиц, и мне бы хотелось, чтобы это было надежным способом, не беспокоясь о заказе. – tom

0

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

Вам также необходимо обратиться к изменению имени первого столбца результирующего фрейма данных.

library(survey) 
fs <- structure(
        c(38, 43, 131, 172, 177, 122, 34, 12, 114, 70, 17, 27), 
       .Dim = c(2L, 6L), 
       .Dimnames = structure(list(services = c("compete", "similar"), 
           party = c("skipped", "Democrat", "Independent", 
           "Libertarian", "Republican", "other")), 
            .Names = c("services", "party"))) 

psp <- structure(c(26, 103), 
       .Dim = 2L, 
       .Dimnames = structure(list(services = c("similar", "compete")), 
             .Names = "services") 
#     ,class = c("svytable", "xtabs", "table") 
#    , call = svytable.survey.design(formula = ~services, 
#            design = fss) 
       ) 
cbind(fs, psp) 

cbind(psp,fs) 

mergeByRowName <- function(d1,d2){ 
    d1 <- data.frame(d1) 
    d2 <- data.frame(d2) 
    d1$rn <- rownames(d1) 
    d2$rn <- rownames(d2) 
    d3 <- merge(d1,d2,by="rn") 
    rownames(d3) <- d3$rn 
    d3$rn <- NULL 
    return(d3) 
} 
d3 <- mergeByRowName(fs,psp) 
d3 

Урожайность это:

 skipped Democrat Independent Libertarian Republican other d2 
compete  38  131   177   34  114 17 103 
similar  43  172   122   12   70 27 26 
Смежные вопросы