在R中组合表

时间:2015-10-01 20:07:47

标签: r merge cbind

已更新

我在尝试在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;自由主义者&#34;列下,行&#34;竞争&#34;值为34和&#34;相似&#34;但是,在组合表(与cbind)中,它是相反的。如果名称不同,它们应显示为不同的列。但是,cbind似乎认识到它们都是相同的价值观。

为什么会这样?

而且,更一般地说,如果有更好的方法来组合表格,我很乐意考虑替代方案。基本上我所拥有的是一些不同的数据集,其中各种人群(政党,商业类型)回答相同的问题。我无法合并数据集,但希望将这些表组合起来进行分析。

谢谢,如果我能更清楚地提出这个问题,请告诉我。

更新:使用代码和表格。

这是正确的表格

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

这是带有错误的组合表。你将需要&#34;调查&#34;包复制。

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

2 个答案:

答案 0 :(得分: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 :(得分: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