R语言处理数据的一些坑

in 百宝箱 Views: 5,074 s with 0 comment

处理csv跳行

一次处理csv文件的时候,非常吃惊+卧槽的发现read.csv()居然每跳一行处理一行数据。
导致最后读取出来的dataframe比实际少了一半。
也有人是就少了那几行。(总之就是数目不对)

解决方案:
用excel打开你的csv文件,全选所有内容,将常规改为文本,另存为,即可解决。

1

这个应该是csv的格式问题。
从前是常规的时候,用sublime打开是这个样子的——

"Receive_Time","Detected_Name","Device_ID"
" 2017/07/18 19:03:09","xxxx","xxx"

处理之后,打开是这个样子的——

Receive_Time,Detected_Name,Device_ID
 2017/07/18 19:03:09,xxxx,xxx

但我觉得应该不单单只是改变了这个地方,否则read.csv()中的quote选项应该是能处理这个问题的。

解决方案2(2017/8/16更新)
发现可以尝试用这个方法来强行解决——
首先将quote设置为空,这样的话引入的文件的每个元素就会包含"",但是行数就是完整的。

temp <- read.csv("data.csv" , header = TRUE, quote = "")

然后引入stringr包来处理字符串。引入这个包的原因是R本身的string处理函数性能较差,会浪费很多不必要的时间,因为接下来要遍历data.frame中的每个元素。

library(stringr)
# 使用apply对temp表格的每个元素进行去除`"`的操作。
temp <- apply(temp,c(1,2),word, 2,sep = fixed("\"")) 
# 将它重新转化为data.frame
temp <- as.data.frame(temp)

好了搞定~不然要是文件数量一多,挨个挨个打开然后修改格式真的要死人啦TAT

批量处理文件

setwd("你的数据所在文件夹的路径")
files<-dir() # 获得文件夹里全部文件的列表
data <- data.frame() # 生成一个空dataframe

for ( i in files){ # 挨个遍历文件,并把文件整合到data这个data.frame中
  temp <- read.csv(i) 
  names(temp)==names(data)
  data <- rbind(data, temp)
}

出现<c7><U+0EA3>

如果出现此类UTF编码,检查下自己读文件的地方,是不是设置了encoding="UTF-8",而文件本身并不是UTF-8编码,所以造成了这个将汉字强行编码成UTF编码的问题。

引入代码时出现以下warning

> source("handle.R")
Error in source("./model/handleSingleLoc.R") : 
  invalid multibyte character in parser at line 10
In addition: Warning messages:
1: In grepl("\n", lines, fixed = TRUE) :
  input string 10 is invalid in this locale
2: In grepl("\n", lines, fixed = TRUE) :
  input string 12 is invalid in this locale

原因:

  1. 准备引入的.R文件和当前.R文件的编码不同。
  2. warning中写的10、12是你准备引入的R文件中有中文注释的行数,再加上编码问题,就导致该字符串无法被当前R文件的编码识别。

解决方案:
为了一口气解决所有文件的编码问题,我将两个文件都修改成了UTF-8
点击顶部工具栏中的file,选择save with encoding...,然后选择你想要的编码。
QQ截图20170816161255.jpg
然后修改source()代码为

source("handle.R", encoding = "UTF-8")

搞定。

告别factor

十次引入文件,九次不需要他默认把你的数据搞成factor格式的时候,直接在开头设置——

options(stringsAsFactors = FALSE)

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

薇拉航线

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

Comments are closed.