我有一个包含 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/