您是否可以合并数据而无需在R中创建单独的数据框?

时间:2016-12-27 02:36:18

标签: r dataframe merge

我的数据框如下所示:

sex year country value
F 2010 AU 350
F 2011 GE 258
M 2010 AU 250
F 2012 GE 928

为了创建按年份和国家/地区合并的其他数据框架,性别和价值成为您想要比较的数据框架,您必须首先创建单独的数据框架,例如:

f <- subset(df, sex=="F")
m <- subset(df, sex=="M")
df_new <- merge(f, m, by=c("country", "year"), suffixes=c("_f", "_m"))

通过这种方式,您可以获得一个包含年份的新数据框,并且匹配的国家/地区只有不同的值。

但是,我不想费心创建单独的数据帧以进行合并。是否可以只用一行编写代码来实现数据框?

2 个答案:

答案 0 :(得分:1)

我们可以执行split,然后使用Reduce/merge可以获得预期的输出

Reduce(function(...) merge(..., by = c("country", "year"),
           suffixes = c("_f", "_m")), split(df, df$sex))
#    country year sex_f value_f sex_m value_m
#1      AU 2010     F     350     M     250

注意:这应该在有&#39; n&#39; unique split列中by个元素的数量(不包含suffixes或其修改)

data.table的重塑选项是

library(data.table)
na.omit(dcast(setDT(df), country + year ~ rowid(country, year), 
                                        value.var = c("sex", "value")))
#   country year sex_1 sex_2 value_1 value_2
#1:      AU 2010     F     M     350     250

答案 1 :(得分:1)

dput(dft)视为:

structure(list(sex = structure(c(1L, 1L, 2L, 1L), .Label = c("F", "M"), class = "factor"), 
year = c(2010, 2011, 2010, 2012), 
country = structure(c(1L, 2L, 1L, 2L), .Label = c("AU", "GE"), class = "factor"), 
value = c(350, 258, 250, 928)), .Names = c("sex", "year", "country", "value"),row.names = c(NA, -4L), class = "data.frame")

您可以使用tidyverse并执行:

dft %>% spread(sex,value)

给出:

#  year country   F   M
#1 2010      AU 350 250
#2 2011      GE 258  NA
#3 2012      GE 928  NA