2016-06-02 14 views
0

Ich habe Daten, die wie diesesErsetzen Werte mit ‚NA‘ durch ID in R

ID v1 v2 
1  1  0 
2  0  1 
3  1  0 
3  0  1 
4  0  1 

ich alle Werte mit ‚NA‘ ersetzt werden soll aussieht, wenn die ID in dem Datenrahmen mehr als einmal auftritt. Das Endprodukt sollte wie folgt aussehen

ID v1 v2 
1  1  0 
2  0  1 
3  NA NA 
3  NA NA 
4  0  1 

ich dies von Hand tun könnte, aber ich will R alle doppelten Fälle erfassen (in diesem Fall zwei Mal ID ‚3‘) und ersetzen Sie die Werte mit ‚NA‘ .

Danke für Ihre Hilfe!

Antwort

4

Sie duplicated() nutzen könnten aus entweder enden und dann ersetzen.

idx <- duplicated(df$ID) | duplicated(df$ID, fromLast = TRUE) 
df[idx, -1] <- NA 

die

ID v1 v2 
1 1 1 0 
2 2 0 1 
3 3 NA NA 
4 3 NA NA 
5 4 0 1 

Diese Arbeit wird auch gibt, wenn die duplizierten IDs nicht nebeneinander sind.

Daten:

df <- structure(list(ID = c(1L, 2L, 3L, 3L, 4L), v1 = c(1L, 0L, 1L, 
0L, 0L), v2 = c(0L, 1L, 0L, 1L, 1L)), .Names = c("ID", "v1", 
"v2"), class = "data.frame", row.names = c(NA, -5L)) 
0

hier ein Basis R Methode

# get list of repeated IDs 
repeats <- rle(df$ID)$values[rle(df$ID)$lengths > 1] 

# set the corresponding variables to NA 
df[, -1] <- sapply(df[, -1], function(i) {i[df$ID %in% repeats] <- NA; i}) 

In der ersten Zeile, verwenden wir rle wiederholt IDs zu extrahieren. Im zweiten Schritt verwenden wir , um Nicht-ID-Variablen zu durchlaufen und IDs zu ersetzen, die für jede Variable mit NA wiederholt werden.

Beachten Sie, dass davon ausgegangen wird, dass der Datensatz nach ID sortiert ist. Dies kann mit der order Funktion erreicht werden. (df <- df[order(df$ID),]).

Wenn der Datensatz sehr groß ist, können Sie die erste Funktion in zwei Schritten brechen zu vermeiden Berechnung der rle zweimal:

dfRle <- rle(df$ID) 
repeats <- dfRle$values[dfRle$lengths > 1] 

Daten

df <- read.table(header=T, text="ID v1 v2 
1  1  0 
2  0  1 
3  1  0 
3  0  1 
4  0  1") 
3

Eine weitere Option:

df1[df1$ID %in% df1$ID[duplicated(df1$ID)], -1] <- NA 
#> df1 
# ID v1 v2 
#1 1 1 0 
#2 2 0 1 
#3 3 NA NA 
#4 3 NA NA 
#5 4 0 1 

Daten

df1 <- structure(list(ID = c(1L, 2L, 3L, 3L, 4L), v1 = c(1L, 0L, 1L, 
0L, 0L), v2 = c(0L, 1L, 0L, 1L, 1L)), .Names = c("ID", "v1", 
"v2"), class = "data.frame", row.names = c(NA, -5L))