2014-04-30 27 views
25

Ich habe eine Tabelle mit zwei Spalten: ob Sie krank waren (H01) und die Anzahl der Tage krank (H03). Allerdings ist die Anzahl der Tage krank NA, wenn H01 == false, und ich würde es auf 0 setzen wie wenn ich dies tun:Beim Versuch, Werte zu ersetzen, sind "fehlende Werte in subskribierten Zuweisungen von Datenrahmen nicht erlaubt"

test <- pe94.person[pe94.person$H01 == 12,] 
test$H03 <- 0 

Es funktioniert gut. Ich möchte jedoch die Werte im ursprünglichen Datenrahmen ersetzen. Dies ist jedoch nicht:

pe94.person[pe94.person$H01 == 12,]$H03 <- 0 

Es gibt:

> pe94.person[pe94.person$H01 == 12,]$H03 <- 0 
Error in `[<-.data.frame`(`*tmp*`, pe94.person$H01 == 12, , value = list(: 
    missing values are not allowed in subscripted assignments of data frames 

Jede Idee, warum das so ist? Für das, was es wert ist, ist hier eine Frequenztabelle:

> table(pe94.person[pe94.person$H01 == 12,]$H03) 

2 3 5 28 
3 1 1 1 
+4

M wahrscheinlich, weil Sie 'NA' in der Spalte 'H01' haben. Beachten Sie das 'useNA'-Argument für die Tabelle, die Sie nicht verwendet haben. Außerdem ist es wahrscheinlich (stilistischer) besser, die Spalte innerhalb von '[' zu referenzieren als mit '$'. – joran

+0

Das macht Sinn; Ich dachte mir so viel aus. Wie würde ich die NA ersetzen? Sorry, ich habe nicht viel Erfahrung mit R. –

+1

'pe94.person $ H01 [is.na (p94.person $ H01)] <- Wert wahrscheinlich. – joran

Antwort

6

Sie können ifelse verwenden wie so

pe94.person$foo <- ifelse(!is.na(pe94.person$H01) & pe94.person$H01 == 12, 0, pe94.person$H03) 

überprüfen, ob foo Ihre Kriterien erfüllt und dann gehen Sie vor und weisen es pe94.person$H03 direkt. Ich finde es sicherer, ihm eine neue Variable zuzuweisen und diese in der Regel in der nachfolgenden Analyse zu verwenden.

26

Es ist aufgrund der fehlenden in H01 Variable.

> x <- data.frame(a=c(NA,2:5), b=c(1:5)) 
> x 
    a b 
1 NA 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
> x[x$a==2,]$b <- 99 
Error in `[<-.data.frame`(`*tmp*`, x$a == 1, , value = list(a = NA_integer_, : 
    missing values are not allowed in subscripted assignments of data frames 

Die Zuordnung wird nicht funktionieren, weil x$a einen fehlenden Wert hat.

Untereinstellung erste Werke:

> z <- x[x$a==2,] 
> z$b <- 99 
> z <- x[x$a==2,] 
> z 
    a b 
NA NA NA 
2 2 2 

Aber das ist, weil die [<- Funktion offenbar nicht Werte in ihrer Extraktion Indizes verarbeiten kann fehlen, obwohl [ kann:

> `[<-`(x,x$a==2,,99) 
Error in `[<-.data.frame`(x, x$a == 2, , 99) : 
    missing values are not allowed in subscripted assignments of data frames 

Also stattdessen versuchen, die Angabe Ihre !is.na(x$a) Teil, wenn Sie die Aufgabe tun:

> `[<-`(x,!is.na(x$a) & x$a==2,'b',99) 
    a b 
1 NA 1 
2 2 99 
3 3 3 
4 4 4 
5 5 5 

oder häufiger:

> x[!is.na(x$a) & x$a==2,]$b <- 99 
> x 
    a b 
1 NA 1 
2 2 99 
3 3 3 
4 4 4 
5 5 5 

Hinweis, dass dieses Verhalten in the documentation beschrieben:

der Ersatz Verfahren können verwendet werden, um ganze Spalte (n) hinzuzufügen, indem nicht vorhandene Spalte spezifiziert (s), in welchem ​​Fall die Spalte (n) am rechten Rand des Datenrahmens hinzugefügt werden und numerische Indizes an bestehende Indizes angrenzen müssen. Auf der anderen Seite können Zeilen in jeder Zeile nach der aktuellen letzten Zeile hinzugefügt werden, und die Spalten werden mit fehlenden Werten gefüllt. Fehlende Werte in den Indizes dürfen nicht ersetzt werden.

+0

Sie können auch fehlende Werte umgehen, indem Sie den Operator '% in%' anstelle von '==' verwenden, siehe [hier] (https://Stackoverflow.com/q/16822426/4241780) für eine Erklärung. Also entweder 'x [x $ a% in% 2,] $ b <- 99 ', oder für das OPs Beispiel' pe94.person [pe94.person $ H01% in% 12,] $ H03 <- 0', würde Arbeit. – JWilliman

2

Nutzen Sie einfach die subset() Funktion alle NA aus dem String auszuschließen.

Es funktioniert als x[subset & !is.na(subset)].Schauen Sie sich diese Daten:

> x <- data.frame(a = c(T,F,T,F,NA,F,T, F, NA,NA,T,T,F), 
>     b = c(F,T,T,F,T, T,NA,NA,F, T, T,F,F)) 

Subsetting mit [ Betreiber dies zurück:

> x[x$b == T & x$a == F, ] 

     a b 
2 FALSE TRUE 
NA  NA NA 
6 FALSE TRUE 
NA.1 NA NA 
NA.2 NA NA 

Und subset() tut, was wir wollen:

> subset(x, b == T & a == F) 

     a b 
2 FALSE TRUE 
6 FALSE TRUE 

Um die Werte von subsetted Variablen zu ändern:

> ss <- subset(x, b == T & a == F) 
> x[rownames(ss), 'a'] <- T 

> x[c(2,6), ] 

    a b 
2 TRUE TRUE 
6 TRUE TRUE 
Verwandte Themen