R 根据唯一值将单个列分隔为多个列

R 根据唯一值将单个列分隔为多个列,r,dplyr,tidyr,data-cleaning,tidy,R,Dplyr,Tidyr,Data Cleaning,Tidy,假设您有一个如下所示的数据表 name time a2 b2 c6 h9 g8 cat 2012 2321 NA NA NA NA dog 1980 NA 424 NA NA NA cat 2101 NA NA 34 NA NA moose 2310 NA NA 5.6 NA NA dog 1972 NA NA NA 34 NA lion 1982 NA NA NA

假设您有一个如下所示的数据表

name  time  a2   b2   c6   h9   g8
cat   2012  2321 NA   NA   NA   NA
dog   1980  NA   424  NA   NA   NA
cat   2101  NA   NA   34   NA   NA
moose 2310  NA   NA   5.6  NA   NA
dog   1972  NA   NA   NA   34   NA
lion  1982  NA   NA   NA   NA   12
我为糟糕的格式表示歉意

name  time  code val
cat   2012  a2   2321
dog   1980  b2   424
cat   2101  c6   34
moose 2310  c6   5.6
dog   1972  h9   34
lion  1982  g8   12
我想让它得到所有唯一的代码,这样表格就可以这样排列

name  time  a2   b2   c6   h9   g8
cat   2012  2321 NA   NA   NA   NA
dog   1980  NA   424  NA   NA   NA
cat   2101  NA   NA   34   NA   NA
moose 2310  NA   NA   5.6  NA   NA
dog   1972  NA   NA   NA   34   NA
lion  1982  NA   NA   NA   NA   12
有人能描述一下我在R如何做到这一点吗?您不必提供任何代码,但一些关于如何做到这一点的指示会很好。我正在使用的数据集要大得多,可能包含许多重复项

任何建议都将不胜感激


感谢您阅读

重塑2
使这些转换非常简单

require(reshape2)

df1 <- structure(list(name = structure(c(1L, 2L, 1L, 4L, 2L, 3L), .Label = c("cat", 
"dog", "lion", "moose"), class = "factor"), time = c(2012L, 1980L, 
2101L, 2310L, 1972L, 1982L), code = structure(c(1L, 2L, 3L, 3L, 
5L, 4L), .Label = c("a2", "b2", "c6", "g8", "h9"), class = "factor"), 
    val = c(2321, 424, 34, 5.6, 34, 12)), .Names = c("name", 
"time", "code", "val"), class = "data.frame", row.names = c(NA, 
-6L))

dcast(df1, name + time ~ code, value.var="val")

   name time   a2  b2   c6 g8 h9
1   cat 2012 2321  NA   NA NA NA
2   cat 2101   NA  NA 34.0 NA NA
3   dog 1972   NA  NA   NA NA 34
4   dog 1980   NA 424   NA NA NA
5  lion 1982   NA  NA   NA 12 NA
6 moose 2310   NA  NA  5.6 NA NA

我只是在这里添加了@Mako212已经提到的
spread
的工作示例:

库(tidyverse)
分布百分比(代码,val)
#>#tibble:6 x 7
#>命名时间a2 b2 c6 g8 h9
#> *       
#>1类2012 2321不适用
#>2类2101 NA 34.0 NA NA
#>3只狗1972年那那那34
#>4只狗1980 NA 424 NA NA NA
#>5狮子1982 NA NA 12 NA
#>6驼鹿2310北美5.6北美
如果在示例输出中维护行顺序很重要,那么在使用
排列之前,只需将
行名称添加到列()

df%>%
行名称到列()%>%
排列(代码,val)
#>#tibble:6 x 8
#>行名名称时间a2 b2 c6 g8 h9
#> *          
#>1 1 cat 2012 2321不适用
#>2两只狗1980年不知道424不知道不知道
#>3 3类2101 NA 34.0 NA NA
#>4 4驼鹿2310北美5.6北美
#>5 5狗1972不,不,不,不,34
#>6狮子1982 NA NA NA 12 NA