我有一个CSV文件。我想在R中读取文件,但只使用前2个逗号,即如果文件中有这样的行,
1,1000,我,完成了,和你在一起
在R中,我希望将其放在具有三列的数据帧的行中,如此
> df <- data.frame("Id"="1","Count" ="1000", "Comment" = "I, am done, with you")
> df
Id Count Comment
1 1 1000 I, am done, with you
答案 0 :(得分:4)
正则表达式将起作用。
例如,假设str
是您要识别的行。这里假设您的csv文件看起来像
1,1000,I, am done, with you
2,500, i don't know
如果您想从文件中读取,只需调用readLines()
将该文件的所有行读作R中的字符向量,就像str
一样。
技术非常简单。在这里,我使用{stringr}
包来匹配文本并提取我需要的信息。
str <- c("1,1000,I, am done, with you", "2,500, i don't know")
library(stringr)
# match the strings by pattern integer,integer,anything
matches <- str_match(str,pattern="(\\d+),(\\d+),\\s*(.+)")
这里我简要解释一下模式(\\d+),(\\d+),\\s*(.+)
。 \\d
代表数字字符,\\s
代表空格字符,.
代表任何内容。 +
表示一个或多个,*
表示无或有。 ()
对模式进行分组,以便函数知道我们认为是一组信息。
如果你看matches
,它看起来像是
[,1] [,2] [,3] [,4]
[1,] "1,1000,I, am done, with you" "1" "1000" "I, am done, with you"
[2,] "2,500, i don't know" "2" "500" "i don't know"
看,str_match
函数通过模式成功地将文本拆分为矩阵。然后我们的工作只是将矩阵转换为具有正确数据类型的数据框。
df <- data.frame(matches[,-1],stringsAsFactors=F)
colnames(df) <- c("Id","Count","Comment")
df <- transform(df,Id=as.integer(Id),Count=as.integer(Count))
df
是我们的目标:
Id Count Comment
1 1 1000 I, am done, with you
2 2 1002 i don't know