我的数据框如下所示:
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"))
通过这种方式,您可以获得一个包含年份的新数据框,并且匹配的国家/地区只有不同的值。
但是,我不想费心创建单独的数据帧以进行合并。是否可以只用一行编写代码来实现数据框?
答案 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