【问题标题】:Removing NAs from a large dataframe从大型数据帧中删除 NA
【发布时间】:2021-11-26 19:22:39
【问题描述】:

我有一个非常大的数据帧,行数 = 10 703 009。我想删除 NA,但收到此错误,“Colloc 无法分配 10703009 字节的内存。 我的输入数据框是“a”,其中有很多行带有 NA,

IDs Codes
1 C493
1 NA
2 E348
3 NA

我需要一个没有 NA 的行的输出

IDs Codes
1 C493
2 E348

我都试过了,但是出现内存错误,

drop_na(a,Codes)
subset(a,Codes)

请在 R 中提出解决方案。

【问题讨论】:

标签: r dataframe dplyr subset tidyr


【解决方案1】:

10,703,009 行的帧对于 R 来说是没有问题的。见下文。我生成了一个tibble,其中变量Codes 包含NA 的行数恰好为probNA = 0.3

library(tidyverse)

n=10703009
probNA = 0.3


df = tibble(IDs = 1:n,  
            Codes = paste0(sample(LETTERS[1:10], n, replace = TRUE), 
                           sample(100:999, n, replace = TRUE))) %>% 
  mutate(Codes = ifelse(sample(c(T,F), n, replace = TRUE, 
                               prob = c(probNA, 1-probNA)), NA, Codes))

df

输出

# A tibble: 10,703,009 x 2
     IDs Codes
   <int> <chr>
 1     1 I586 
 2     2 A188 
 3     3 H674 
 4     4 D641 
 5     5 A793 
 6     6 B455 
 7     7 B837 
 8     8 A805 
 9     9 NA   
10    10 E380 
# ... with 10,702,999 more rows

这样一个tibble的大小是object.size (df)返回12 894 1096 bytes

我们将尝试删除带有 NA 值的行。

df %>% filter(!is.na(Codes))

输出

# A tibble: 7,490,809 x 2
     IDs Codes
   <int> <chr>
 1     1 I586 
 2     2 A188 
 3     3 H674 
 4     4 D641 
 5     5 A793 
 6     6 B455 
 7     7 B837 
 8     8 A805 
 9    10 E380 
10    11 C231 
# ... with 7,490,799 more rows

现在让我们用空字符串替换所有 NA 值。

df %>% mutate(Codes = ifelse(is.na(Codes), "", Codes))

输出

# A tibble: 10,703,009 x 2
     IDs Codes 
   <int> <chr> 
 1     1 "I586"
 2     2 "A188"
 3     3 "H674"
 4     4 "D641"
 5     5 "A793"
 6     6 "B455"
 7     7 "B837"
 8     8 "A805"
 9     9 ""    
10    10 "E380"
# ... with 10,702,999 more rows

如您所见,一切顺利,没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 2023-03-20
    • 2018-11-04
    相关资源
    最近更新 更多