【发布时间】:2017-06-05 14:49:52
【问题描述】:
我正坐在一个如下所示的数据框前:
country year Indicator a b c
48996 US 2003 var1 NA NA NA
16953 FR 1988 var2 NA 10664.920 NA
22973 FR 1943 var3 NA 5774.334 NA
8760 CN 1995 var4 8804.565 NA 12750.31
47795 US 2012 var5 NA NA NA
30033 GB 1969 var6 NA 29631.362 NA
25796 FR 1921 var7 NA 14004.520 NA
39534 NL 1941 var8 NA NA NA
42255 NZ 1969 var8 NA NA NA
7249 CN 1995 var9 50635.862 NA 75260.56
我想要做的基本上是以Indicator 作为关键变量进行长到宽的转换。我通常会使用tidyr 包中的spread()。但是,spread() 不幸的是不接受多个值列(在本例中为 a、b 和 c),它并没有完全实现我想要实现的目标:
- 将
Indicator的条目设为新列 - 将国家/地区/年份组合保留为行
- 为来自
a、b和c的每个旧值创建一个唯一的行 - 为每个“旧”值列名称创建一个虚拟变量(即, b, c)
所以最后,我的例子的中文观察应该变成
country year var1 [...] var4 [...] var9 dummy.a dummy.b dummy.c
CN 1995 NA 8804.565 50635.862 1 0 0
CN 1995 NA 12750.31 75260.56 0 0 1
由于我的原始数据帧是 58.162x119,因此我会很感激不包含大量手动工作的东西 :-)
我希望我清楚自己想要实现的目标。感谢您的帮助!
可以使用以下代码复制上述数据帧:
structure(list(country = c("US", "FR", "FR", "CN", "US", "GB",
"FR", "NL", "NZ", "CN"), year = c(2003L, 1988L, 1943L, 1995L,
2012L, 1969L, 1921L, 1941L, 1969L, 1995L), Indicator = structure(c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 8L, 9L), .Label = c("var1", "var2",
"var3", "var4", "var5", "var6", "var7", "var8", "var9", "var10",
"var11", "var12", "var13", "var14", "var15", "var16", "var17",
"var18"), class = "factor"), a = c(NA, NA, NA, 8804.56480733,
NA, NA, NA, NA, NA, 50635.8621327), b = c(NA, 10664.9199219,
5774.33398438, NA, NA, 29631.3618614, 14004.5195312, NA, NA,
NA), c = c(NA, NA, NA, 12750.3056855, NA, NA, NA, NA, NA, 75260.555946
)), .Names = c("country", "year", "Indicator", "a", "b", "c"), row.names = c(48996L,
16953L, 22973L, 8760L, 47795L, 30033L, 25796L, 39534L, 42255L,
7249L), class = "data.frame")
【问题讨论】:
-
Imo,这是一种非常糟糕的数据格式,但您可以像
library(data.table); melt(setDT(DF, keep.rownames = TRUE), id=c("rn", "country", "year", "Indicator"))[!is.na(value), dcast(.SD, country + year + variable ~ Indicator)][, dcast(.SD, ... ~ variable, value.var="variable", fun=length)]一样到达那里 -
我认为您基于输入的预期不正确。例如,'year' 1983 的 Var4 应该是 8804.565 和 12750.306
-
您使用
dput提供的数据集与您的示例不同。例如,在第 4 行中,年份是1983还是1995? -
我的错,修好了。我确实手动更改了一年以更清楚地说明我想要实现的目标并忘记在示例代码中进行更改。对不起!
-
感谢更新数据集。你能解释一下为什么在虚拟变量
a to c中第一行CN是1, 0, 0而第二行是0, 0, 1?因为根据您的原始数据框,a和c都具有这两行的值。
标签: r dataframe dplyr tidyr tidyverse