Функция для заполнения столбца с NA того же типа - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть фрейм данных со многими столбцами разных типов.Я хотел бы заменить каждый столбец на NA соответствующего класса.

, например:

df = data_frame(x = c(1,2,3), y = c("a", "b", "c"))

df[, 1:2] <- NA

дает кадр данных с двумя логическими столбцами, а не цифрой и символом.Я знаю, что могу сказать R:

df[,1] = as.numeric(NA)
df[,2] = as.character(NA)

Но как мне сделать это все вместе в цикле для всех столбцов со всеми возможными типами NA?

Ответы [ 5 ]

0 голосов
/ 11 декабря 2018

Еще один способ изменить все столбцы одновременно, сохраняя классы переменных:

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> 

Как @digEmAll уведомил в комментариях, есть еще один похожий, но более короткий способ:

df[] <- lapply(df, function(x) as(NA,class(x)))
0 голосов
/ 11 декабря 2018

Использование 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   

Если мы хотим преобразовать только подмножество столбцов в NA , то:

# 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
0 голосов
/ 11 декабря 2018

Используя bind_cols() из dplyr, вы также можете сделать:

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 

Обратите внимание, что это изменит названия.

0 голосов
/ 11 декабря 2018

Другое решение, которое применяется к всем столбцам, может заключаться в указании не-NA и замене на NA, т.е.

df[!is.na(df)] <- NA

, что дает,

# A tibble: 3 x 2
      x    y    
  <dbl> <chr>
1    NA <NA> 
2    NA <NA> 
3    NA <NA> 
0 голосов
/ 11 декабря 2018

Вы можете использовать этот «трюк»:

df[1:nrow(df),1] <- NA
df[1:nrow(df),2] <- NA

[1:nrow(df),] в основном указывает R на заменить все значения в столбце на NA и, таким образом, логическийNA приводится к исходному типу столбца перед заменой других значений.

Кроме того, если вам нужно заменить много столбцов, а в data_frame много строк, я предлагаю сохранить строкуиндексирует и повторно использует их:

rowIdxs <- 1:nrow(df)
df[rowIdxs ,1] <- NA
df[rowIdxs ,2] <- NA
df[rowIdxs ,3] <- NA
...

Как умно предложено @ RonakShah , вы также можете использовать:

df[TRUE, 1] <- NA
df[TRUE, 2] <- NA
...

Как указано @ Cath оба метода по-прежнему работают при выборе более одного столбца, например:

df[TRUE, 1:3] <- NA
# or
df[1:nrow(df), 1:3] <- NA
...