r - 为什么我的用于过滤数据的 R 代码会产生不同的结果 "fread()"和 "ffdf()"?

标签 r dplyr data.table ff

我有一个包含 700 万条记录和 160 个变量的大文件。我开始知道 fread() 和 read.csv.ffdf() 是处理如此大数据的两种方法。但是当我尝试使用 dplyr 过滤这两个数据集时,我得到了不同的结果。以下是我的数据的一小部分-

 sample_data
AGE AGE_NEONATE AMONTH AWEEKEND
2   18                  5        0
3   32                 11        0
4   67                  7        0
5   37                  6        1
6   57                  5        0
7   50                  6        0
8   59                 12        0
9   44                  9        0
10  40                  9        0
11  27                  3        0
12  59                  8        0
13  44                  7        0
14  81                 10        0
15  59                  6        1
16  32                 10        0
17  90                 12        1
18  69                  7        0
19  62                 11        1
20  85                  6        1
21  43                 10        0

代码1
sample_data <- fread("/user/sample_data.csv", stringsAsFactors = T)
age_filter<-sample_data%>%filter(!(is.na(AGE)), between(as.numeric(AGE),65 , 95))

结果1-
AGE AGE_NEONATE AMONTH AWEEKEND
1  67          NA      7        0
2  81          NA     10        0
3  90          NA     12        1
4  69          NA      7        0
5  85          NA      6        1

代码2-
sample_data <- read.csv.ffdf(file="C:/Users/sample_data.csv", header=F ,fill=T)
header.true <- function(df) {
      names(df) <- as.character(unlist(df[1,]))
      df[-1,]
      }
sample_data<-tbl_ffdf(sample_data)
sample_data<-header.true(sample_data)
age_filter<-sample_data%>%filter(!(is.na(AGE)), between(as.numeric(AGE),65 , 95))

结果2-
AGE AGE_NEONATE AMONTH AWEEKEND
1  81                 10        0
2  90                 12        1
3  85                  6        1

我知道我的第一个代码是正确的,并给了我正确的结果。我在第二个代码中做错了什么?

最佳答案

我还没有真正尝试过运行您的代码,但从我所见,我怀疑以下几点:

在您的第二个代码版本中,您正在读取标题作为数据的一部分。这导致所有列都被导入为 character而不是 numeric .
此外,您很可能有 default.stringsAsFactors()返回 TRUE ,意味着导入的字符列被视为 factors .

现在我猜你的 between应用于 65 到 95 之间的因子水平,而不是实际数字。由于您可能没有每年(年龄)的数据,因此 67 和 69 可能映射到 65 以下的因子水平(即 as.numeric(AGE) 将返回数字映射到的因子水平,而不是您看到的数字打印时)。

尝试使用 stringsAsFactors = FALSE或在阅读后显式转换为字符。

关于r - 为什么我的用于过滤数据的 R 代码会产生不同的结果 "fread()"和 "ffdf()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49518947/

相关文章:

r - 在R中手动下载和安装软件包

r - n行后停止打印

R 如何从数据框中的长列名中删除字符

r - dplyr group_by 可变长度限制

r - 在 dplyr::mutate 中传递公式表达式

r - 通过 data.table 中的变量名在 i 中设置子集

r - 将回归线拟合为 R 中对数轴的图形

r - 使用过滤器查找每组的唯一值

对 R 中每个值的变化进行排名

r - 缓慢的 data.table 子集与 dplyr