【问题标题】:data frame from character vector that contains three comma seperated values in each row来自字符向量的数据帧,每行包含三个逗号分隔值
【发布时间】:2016-08-13 01:21:53
【问题描述】:

如何从每行包含三个逗号分隔值的长字符向量创建数据帧的列。第一个元素包含数据框列的名称。

不是每一行都有三列,有些地方只有一个逗号:

> string.split.cols[1] #This row is the .names
[1] "Acronym,Full form,Remarks"
> string.split.cols[2]
[1] "AC,Actual Cost, "
> string.split.cols[3]
[1] "ACWP,Actual Cost of Work Performed,Old term for AC"
> string.split.cols[4]
[1] "ADM,Arrow Diagramming Method,Rarely used now"
> string.split.cols[5]
[1] "ADR,Alternative Dispute Resolution, "
> string.split.cols[6]
[1] "AE,Apportioned Effort, "

输出应该是一个包含三列的 df,我只对前两列感兴趣,将丢弃第三列。

这是原始字符串,有些列没有转义逗号,但这没什么大不了的。

string.cols [1] "Acronym,Full form,Remarks\nAC,Actual Cost, \nACWP,Actual Cost of Work Performed,Old term for AC\nADM,Arrow Diagramming Method,Rarely used now\nADR,Alternative Dispute Resolution, \nAE,Apportioned Effort, \nAOA,Activity-on-Arrow,Rarely used now\nAON,Activity-on-Node, \nARMA,Autoregressive Moving Average, \nBAC,Budget at Completion, \nBARF,Bought-into, Approved, Realistic, Formal,from Rita Mulcahy's PMP Exam Prep\nBCR,Benefit Cost Ratio, \nBCWP,Budgeted Cost of Work Performed,Old term for EV\nBCWS,Budgeted Cost of Work Scheduled,Old term for PV\nCA,Control Account, \nCBR,Cost Benefit Ratio, \nCBT,Computer-Based Test, \n..."

【问题讨论】:

  • 你看过read.csvreadr::read_csvdata.table::fread吗?
  • 我不想使用文件,它是一个字符串,我收到a <- fread(string.split.cols, header = TRUE) 的此错误:'input' 必须是包含文件名、命令、完整路径的单个字符串文件、以“http[s]://”、“ftp[s]://”或“file://”开头的 URL,或输入数据本身。似乎它应该工作,但我不知道。
  • 如果read.csvtext 参数不够用,请使用pastecollapse = '\n' 将其作为单个文本字符串处理,大多数阅读器函数都可以处理,例如readr::read_csv(paste(x, collapse = '\n'))data.table::fread(paste(x, collapse = '\n'))

标签: r


【解决方案1】:

你试过read.csv的文本输入吗?

df <- read.csv( text = string.split.cols, header = T )

【讨论】:

  • header = TRUEread.csv 的默认值,因此您不必指定。
  • @alistaire 是的,我只是想让 OP 清楚该过程,因为明确指出了第一行包含“名称”这一事实。
  • 这种方法并不完美,它会在出现这样的单词时产生问题:[109] SWOT Strengths, [110] Opportunities and Threats, [111] T&amp;M Time and Material 但我必须检查原始字符串,也许那里有逗号。它适用于我 99% 的行,因此我可以使用它。啊,我明白了,第二列 SWOT 中有逗号,优势\,机会\,弱点\,威胁,因为它们没有被转义,所以它们分开了。
  • 您可以在调用中指定colClasses。这有帮助吗?
  • 你的意思是因为这些行的逗号太少了吗?
【解决方案2】:

我发现这个例程在拆分字符串和转换为数据帧方面非常快。

slist<-strsplit(mylist,",")
  x<-sapply(slist, FUN= function(x) {x[1]})
  y<-sapply(slist, FUN= function(x) {x[2]})
  df<-data.frame(Column1Name=x, Column2Name=y, stringsAsFactors = FALSE)

mylist 是要拆分的字符串向量。

【讨论】:

    【解决方案3】:

    拆分字符串后,您可以使用rbind.data.frame 来执行此操作:

    x <- do.call(rbind.data.frame, strsplit(split.string.cols[-1], ','))
    names(x) <- strsplit(split.string.cols[1], ',')[[1]]
    x
    ##  Acronym                     Full form         Remarks
    ## 1      AC                   Actual Cost                
    ## 2    ACWP Actual Cost of Work Performed Old term for AC
    ## ...
    

    作为单行:

    setNames(do.call(rbind.data.frame, 
                     strsplit(split.string.cols[-1], ',')
             ),
             strsplit(split.string.cols[1], ',')[[1]]
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 2013-07-14
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      相关资源
      最近更新 更多