2017-11-14 5 views
2

Table1 $ Betreff enthält die Variablen "Biologie", "Chemie" und "Physik". Für Tabelle 2 möchte ich das umschreiben, um alle Instanzen von Biologie/Chemie durch 1 und alle Instanzen von Physik durch 0 zu ersetzen.Verwendung von recode und case_when zusammen

Ich habe den folgenden Code versucht, da ich glaube, dass dies mit dem recode und case_when erreichbar ist Befehle: Aktuell

Table2 <- recode(Table1, case_when(
    .$subject <= "biology" ~ 1, 
    .$subject <= "chemistry" ~ 1, 
    .$subject <= "physics" ~ 0)) 

, ich eine Fehlermeldung sagen „case_when eine zweiseitige Formel sein muss, nicht eine logische“. Ich bin neu bei R, also bin ich mir nicht ganz sicher, was ich falsch mache. Wirklich dankbar, wenn jemand irgendwelche Ideen hat!

Antwort

1

Sowohl recode als auch case_when arbeiten mit Vektoren, nicht mit Datenrahmen. Um einen neuen Datenrahmen zu erstellen, müssen Sie zuerst mutate aufrufen und innerhalb von mutate entweder recode oder case_when verwenden, um eine neue Spalte zu erstellen (oder eine vorhandene zu überschreiben).

(Auch, wie der neuesten Sie dplyr lösen müssen nicht mehr die .$ verwenden, wenn mit case_when)


library(tibble) 
library(dplyr) 

df <- tribble(
    ~subject, 
    "chemistry", 
    "biology", 
    "physics" 
) 

df %>% 
    mutate(subject2 = case_when(
    subject == "chemistry" ~ 1, 
    subject == "biology" ~ 1, 
    subject == "physics" ~ 2, 
)) 

#> # A tibble: 3 x 2 
#>  subject subject2 
#>  <chr> <dbl> 
#> 1 chemistry  1 
#> 2 biology  1 
#> 3 physics  2 

df %>% 
    mutate(subject2 = recode(
    subject, 
    "chemistry" = 1, 
    "biology" = 1, 
    "physics" = 2, 
)) 

#> # A tibble: 3 x 2 
#>  subject subject2 
#>  <chr> <dbl> 
#> 1 chemistry  1 
#> 2 biology  1 
#> 3 physics  2 
1

Das erinnerte mich an, als ich begann zuerst mit R arbeiten, Ich ging auch hin und fragte die Datenwissenschaftler genau diese Frage.

Sie teilten mir einen anderen Ansatz, der in diesen Situationen im Allgemeinen vorzuziehen ist. Ich habe viele Male zurückgeschaut und es sehr geschätzt, dass ich es früh gelernt habe.

Der Ansatz zur Normalisierung der Datenbank (es sei denn, jemand kann uns mit einem besseren Namen helfen) beinhaltet die Abbildung Ihrer Codewerte in einen separaten Datenrahmen. Dann nehmen Sie diese Sammlung von gemappten Werten und join sie zu dem Datenrahmen, den Sie verschlüsseln möchten.

Dies hilft, den Code strenger verantwortlich für Manipulationen und die Datenrahmen verantwortlich fürWerte/Daten halten. Dies kann nicht nur einen Großteil Ihrer Arbeit beschleunigen, sondern Sie auch davor bewahren, in fest codierten Nachschlagetabellen von Hand zu codieren, aber auf lange Sicht wird es viel einfacher, wenn jemand debuggt oder Änderungen und Neuentwicklungen durchführt.

Der Ansatz normalisierte Datenmanagement dann würde wie folgt aussehen:

# your code mapping 
df_map <- tribble(~subject, ~subj_cd, 
        "chemistry", 1, 
        "biology", 1, 
        "physics", 0) 

# a dummy raw dataframe that you might be wanting to encode 
df_raw <- tibble(stud_id = 2678:2877, 
       subject = sample(c("chemistry", 
            "biology", 
            "physics", 
            "astronomy"), 200, replace = TRUE)) 

# encoding the data 
df_coded <- 
    df_raw %>% 
    left_join(df_map) 
df_code 
> df_coded 
# A tibble: 200 x 3 
    stud_id subject subj_cd 
    <int>  <chr> <dbl> 
1 2678 physics  2 
2 2679 physics  2 
3 2680 biology  1 
4 2681 astronomy  NA 
5 2682 chemistry  1 
6 2683 chemistry  1 
7 2684 physics  2 
8 2685 chemistry  1 
9 2686 chemistry  1 
10 2687 astronomy  NA 
# ... with 190 more rows 

Wenn Sie sich um eine schnelle und einfache Art und Weise finden mehr Code-Karten zu bauen (oder, vor allem, sie teilen mit anderen Leuten), dann wirst du wahrscheinlich Jenny Brians googlesheets Paket sehr hilfreich finden (sie ist ein Mitglied des Teams tidyverse) Ein wirklich helpful vignette for it can be found here

Verwandte Themen