2017-09-18 1 views
1

Sagen Sie bitte eine Datentabelle, die wie dieserSeparate einzelne Spalte in mehrere auf eindeutige Werte je

sieht ich für die schlechte Formatierung entschuldigen

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 

ich es will alle eindeutigen Codes erhalten, so dass die Tabelle so angeordnet ist

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 

Könnte jemand bitte beschreiben, wie ich das in R machen würde? Sie müssen keinen Code zur Verfügung stellen, aber ein Hinweis darauf, wie dies zu tun wäre, wäre nett. Der Datensatz, mit dem ich arbeite, ist viel größer und kann viele Duplikate enthalten.

Jede Beratung sehr geschätzt wird

Danke für

Antwort

1

reshape2 Lesen macht diese Transformationen ziemlich einfach.

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 

Oder ähnlich mit tidyr::spread. tidyr ist ein wenig intuitiv, mit dem Format spread(data, <column name whose values will be used as headings>, values)

spread(df1,code,val) 
+0

Ich sehe das ist, was ich gesucht habe, danke! –

1

Ich bin nur wie bereits erwähnt von @ Mako212 das bearbeitete Beispiel hier für spread Zugabe:

library(tidyverse) 

df <- tribble(
~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) 

df %>% spread(code, val) 
#> # A tibble: 6 x 7 
#> name time a2 b2 c6 g8 h9 
#> * <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 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 

Wenn die Aufrechterhaltung der Reihe Bestellung in der Beispielausgabe ist wichtig, dann einfach hinzufügen rownames_to_column() vor der Verwendung spread:

df %>% 
    rownames_to_column() %>% 
    spread(code, val) 
#> # A tibble: 6 x 8 
#> rowname name time a2 b2 c6 g8 h9 
#> * <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1  1 cat 2012 2321 NA NA NA NA 
#> 2  2 dog 1980 NA 424 NA NA NA 
#> 3  3 cat 2101 NA NA 34.0 NA NA 
#> 4  4 moose 2310 NA NA 5.6 NA NA 
#> 5  5 dog 1972 NA NA NA NA 34 
#> 6  6 lion 1982 NA NA NA 12 NA 
+0

Ich sehe, danke für die Hilfe! –

Verwandte Themen