一次小小的R输出的翻车经历
2020-01-06 本文已影响0人
城管大队哈队长
之前发现了具名向量在用 write.csv
输出的时候,列名刚好会是向量的名字,所以一直用 write.csv
来输出结果。但今天突然发现我输出的那个向量的行名消失了,但如果我随机抽取了其中一部分向量输出,行名仍旧在。所以我做了一个测试,发现了一个奇怪的现象,R在小数据输出的时候,会保留行名,而在大数据输出的时候,行名则不会保留,怀疑会不会是R的内存管理机制。
> a <- 1:10
> names(a) <- stringi::stri_rand_strings(10,length = 5)
> write.csv(a,"a.csv")
> read.csv("a.csv")[1:5,]
X x
1 3dggA 1
2 gVyHC 2
3 2EBPT 3
4 5dCJT 4
5 laCOU 5
> b <- 1:10E5
> names(b) <- stringi::stri_rand_strings(10E5,length = 5)
> write.csv(b,"b.csv")
> read.csv("b.csv")[1:5,]
X x
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
然后在twitter上Po出了这个问题,后来一个老哥提醒了我,可能并不是R对于大小数据敏感,而只是我的测试数据单纯有重复名字。
> length(unique(stringi::stri_rand_strings(10E5,length = 5)))
[1] 999440
在我换了测试数据之后,果然这个 “bug” 消失了。
> b <- 1:10E5
> names(b) <- paste0("str",1:10E5)
> write.csv(b,"b.csv")
> read.csv("b.csv")[1:5,]
X x
1 str1 1
2 str2 2
3 str3 3
4 str4 4
5 str5 5
所以最后感觉是R不支持有行名相同导致的情况……