2017-02-15 3 views
0

ich ein Problem mit einigen meiner Code hatte und ich es fest, aber nicht vollständig verstehen, warum der Fehler ein FehlerR typisieren NA vs String

war

Der Code sah aus wie:

for(i in 1:3){df = rbind.fill(z, data.frame(id=i, 
data=if(is.null(x$results[[i]]$synopsis$data))  
{NA}else{x$results[[i]]$synopsis$data}))} 

Die Problem, das ich hatte war, wenn der erste Datenwert tatsächlich Null war, würde ich NA bekommen, aber dann für die zweite und dritte würde ich entweder eine andere NA bekommen oder wenn es Daten gab, würde ich es nicht bekommen, würde ich 1 bekommen.

Wenn der erste Wert Daten wäre, dann würde ich die Daten bekommen und für die anderen beiden würde ich entweder NA oder die richtigen Daten bekommen.

Ich bin kein Computerwissenschaftler, aber ein Entwickler, der neben mir sitzt (aber R nicht weiß), schlug vor, dass es etwas mit verschiedenen Typumwandlungen von NA und einer Zeichenkette zu tun hatte. Um das Problem zu lösen, habe ich die NA in "0" geändert (ich nehme an, "NA" würde auch funktionieren).

Ich möchte nur eine gründlichere Erklärung, was passiert ist. Mein Laie Verständnis ist, wenn NA das erste Ergebnis war, dann ist jedes Ergebnis in diesem "Format", wo etwas entweder NA oder nicht ist und nicht als 1 behandelt wird, die ein bisschen wie eine boolesche Antwort ist?

Beispiel:

my.list <- list(list(),structure(
    list(
     experience = structure(
      list(
       start = "Hi" 
      ),.Names = c("start")), 
     `_meta` = structure(
      list(weight = 1L, `_sources` = list(structure(
       list(`_origin` = "a"), .Names = "_origin" 
      ))),.Names = c("weight", "_sources"))),.Names = c("experience", "_meta"))) 

my.list[[1]]$experience$start 
    NULL 
my.list[[2]]$experience$start 
    [1] "Hi" 


    df <- NULL 
    for(i in 1:2){df = rbind.fill(df, data.frame(id=i, 
data=if(is.null(my.list[[i]]$experience$start))             
    {NA}else{my.list[[i]]$experience$start}))} 

Dann

df2 <- NULL 
for(i in 1:2){df2 = rbind.fill(df2, data.frame(id=i,            
data=if(is.null(my.list[[i]]$experience$start))              
{"NA"}else{my.list[[i]]$experience$start}))} 

Ergebnisse:

df:    df2: 

id data  id data 
1 NA   1 NA 
2 1   2 HI 
+0

Was ist das erwartete Ergebnis für 'df'? Nur eine Zeile mit der Erfahrung Start ID2 "Hallo" oder zwei Zeilen? –

+0

aktualisiert mit Ergebnissen - df1 ist falsch, und ich würde gerne wissen, warum – Olivia

Antwort

1

Olivia, vielen Dank für Erläuterungen. Sie sind fast da. Wenn Sie eine Schleife erstellen, bestimmt die erste Iteration tatsächlich die Klasse der Spalte data Ihrer Ausgabedaten.frame df.

In Szenario 1 können Sie, indem Sie durch die Schleife Schritt für Schritt eine bessere Idee:

df <- NULL 
i=1 
df = rbind.fill(df, data.frame(id=i, 
    data=if(is.null(my.list[[i]]]$experience$start)) {NA} 
    else{my.list[[i]]$experience$start})) 
df 

    id data 
1 1 NA 

Dann haben Sie einen Blick auf Klasse von df$data

class(df$data) 
[1] "logical" 

, die abgeleitet ist : mode(NA) (logisch).

Als eine alternative Möglichkeit, wenn Sie Daten in Ihrem Satz von Experimenten in einer Liste speichern, sollten Sie versuchen, einen "R-ish" Weg zu verwenden, um diese Liste zu manipulieren.

Zum Beispiel können Sie versuchen:

sapply(my.list, FUN=function(element)element$experience$start) 
[[1]] 
NULL 

[[2]] 
[1] "Hi" 

Welche hebt hervor, dass Sie zusammen Sätze von inkompatiblen Inhalte zu sammeln versucht: Vereinfachung nicht einfacher als diese Liste gehen können - wenn Sie unlist Sie diese bedeutungsvolle entlassen würde NULL

+0

Die NULL oder NA sind erforderlich, so dass die Anzahl der Zeilen korrekt ist. Aus diesem Grund gibt es eine ID-Spalte basierend auf i. Meine tatsächlichen Daten sind komplizierter und ziehen von verschachtelten Listen, die von einer JSON-Antwort von einer API stammen. Die Verwendung von "0" scheint zu funktionieren. Ich habe nicht überprüft und gesehen, ob 0 auch funktionieren würde oder ob das Zahlen würde die folgenden Charaktere durcheinander bringen – Olivia