Ich habe einen Datenrahmen mit vielen Spalten verschiedener Typen. Ich möchte jede Spalte durch NA der entsprechenden Klasse ersetzen.
zum Beispiel:
df = data_frame(x = c(1,2,3), y = c("a", "b", "c"))
df[, 1:2] <- NA
ergibt einen Datenrahmen mit zwei logischen Spalten anstelle von numerischen und Zeichen .
df[,1] = as.numeric(NA)
df[,2] = as.character(NA)
Aber wie mache ich das in einer Schleife für alle Spalten mit allen möglichen NA-Typen?
Sie können diesen "Trick" verwenden:
df[1:nrow(df),1] <- NA
df[1:nrow(df),2] <- NA
die [1:nrow(df),]
teilt R grundsätzlich mit replace allen Werten in der Spalte mit NA
mit, und auf diese Weise wird die logische NA
auf den ursprünglichen Typ der Spalte gezwungen, bevor die anderen Werte ersetzt werden.
Wenn Sie viele Spalten zum Ersetzen haben und der data_frame viele Zeilen hat, empfehle ich, die Zeilenindizes zu speichern und erneut zu verwenden:
rowIdxs <- 1:nrow(df)
df[rowIdxs ,1] <- NA
df[rowIdxs ,2] <- NA
df[rowIdxs ,3] <- NA
...
Wie geschickt von @RonakShah vorgeschlagen, können Sie auch Folgendes verwenden:
df[TRUE, 1] <- NA
df[TRUE, 2] <- NA
...
Wie von @Cath ausgeführt, funktionieren beide Methoden immer noch, wenn Sie mehr als eine Spalte auswählen, z. :
df[TRUE, 1:3] <- NA
# or
df[1:nrow(df), 1:3] <- NA
Eine andere Lösung, die für all die Spalten gilt, kann darin bestehen, die Nicht-NAs anzugeben und durch NA zu ersetzen, d. H.
df[!is.na(df)] <- NA
was gibt,
# A tibble: 3 x 2 x y <dbl> <chr> 1 NA <NA> 2 NA <NA> 3 NA <NA>
Eine andere Möglichkeit, alle Spalten gleichzeitig zu ändern und dabei die Klassen der Variablen beizubehalten:
df[] <- lapply(df, function(x) {type <- class(x); x <- NA; class(x) <- type; x})
df
# A tibble: 3 x 2
# x y
# <dbl> <chr>
#1 NA <NA>
#2 NA <NA>
#3 NA <NA>
Wie @digEmAll in Kommentaren mitteilte, gibt es einen ähnlichen, aber kürzeren Weg:
df[] <- lapply(df, function(x) as(NA,class(x)))
Verwenden von dplyr :: na_if :
library(dplyr)
df %>%
mutate(x = na_if(x, x),
y = na_if(y, y))
# # A tibble: 3 x 2
# x y
# <dbl> <chr>
# 1 NA NA
# 2 NA NA
# 3 NA NA
Wenn wir nur einen Teil der Spalten zuNAmutieren möchten, dann gilt Folgendes:
# dataframe with extra column that stay unchanged
df = data_frame(x = c(1,2,3), y = c("a", "b", "c"), z = c(4:6))
df %>%
mutate_at(vars(x, y), funs(na_if(.,.)))
# # A tibble: 3 x 3
# x y z
# <dbl> <chr> <int>
# 1 NA NA 4
# 2 NA NA 5
# 3 NA NA 6
Mit bind_cols()
von dplyr
können Sie auch Folgendes tun:
df <- data_frame(x = c(1,2,3), y = c("a", "b", "c"))
classes <- sapply(df, class)
df[,1:2] <- NA
bind_cols(lapply(colnames(x), function(x){eval(parse(text=paste0("as.", classes[names(classes[x])], "(", df[,x],")")))}))
V1 V2
<dbl> <chr>
1 NA NA
2 NA NA
3 NA NA
Bitte beachten Sie, dass dadurch die Colnames geändert werden.