根据R中的固定长度分隔字符串,以创建列

时间:2014-10-30 21:39:33

标签: r string dataframe

我有一个字符串列表,我想将其转换为数据帧。我想根据一些固定的长度划分每个字符串,例如,假设我的列表看起来像:

text = c("ABC      ABC BROWNIES COMPANY            1/31/2009",
         "BCD      BCD BROWNIES COMPANY            1/31/2009")

我希望将其转换为使用的数据框:

FINAL <- data.frame(rbind(c("ABC", "ABC BROWNIES COMPANY","1/31/2009"),c("BCD", "BCD BROWNIES COMPANY","1/31/2009")),stringsAsFactors = F)

colnames(FINAL) = c("Ticker","Company","Date")

FINAL

基本上我想引入某种固定长度分隔来分隔“text”的每个元素中的项目。 我不认为我可以使用strsplit,因为我没有一个字符可以拆分(空格不起作用,因为我的一些条目包含空格,并且“Ticker”到“Company”有不均匀的空格, “公司”至“日期”)。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

由于您提到了固定长度分隔符,因此可以尝试read.fwf

read.fwf(textConnection(text), widths = c(3, 21, 13), 
         col.names = c("Ticker", "Company", "Date"))
#   Ticker               Company       Date
# 1    ABC  ABC BROWNIES COMPANY  1/31/2009
# 2    BCD  BCD BROWNIES COMPANY  1/31/2009

您可以使用中间21值来处理所有数据。

另一种可能性是分成三个或更多空格。

data.frame(do.call(rbind, strsplit(text, " {3,}")))
#    X1                   X2        X3
# 1 ABC ABC BROWNIES COMPANY 1/31/2009
# 2 BCD BCD BROWNIES COMPANY 1/31/2009

答案 1 :(得分:1)

使用read.fwf或用分隔符替换长跨度的空格。

> read.table( text=gsub(" {3,10}", ",", text), sep="," )
   V1                   V2          V3
1 ABC ABC BROWNIES COMPANY   1/31/2009
2 BCD BCD BROWNIES COMPANY   1/31/2009

答案 2 :(得分:0)

str_split_fixed可能stringr

library(stringr)
##
Df <- data.frame(
  str_split_fixed(text,pattern="\\s{2,}",3),
  stringsAsFactors=F)
##
names(Df) <- c("Ticker","Company","Date")
##
> Df
  Ticker              Company      Date
1    ABC ABC BROWNIES COMPANY 1/31/2009
2    BCD BCD BROWNIES COMPANY 1/31/2009
> str(Df)
'data.frame':   2 obs. of  3 variables:
 $ Ticker : chr  "ABC" "BCD"
 $ Company: chr  "ABC BROWNIES COMPANY" "BCD BROWNIES COMPANY"
 $ Date   : chr  "1/31/2009" "1/31/2009"

假设2个或更多连续的空格表示新列;虽然如有必要可以调整。