it-swarm.com.de

Eine Funktion zum Ausfüllen einer Spalte mit NA desselben Typs

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?

17
Omry Atia

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
10
digEmAll

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> 
8
Sotos

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)))
5
Cath

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
4
zx8754

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.

0
alex_555