已更新
我在尝试在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
答案 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