拆分数据框中的列

Splitting columns in a dataframe

我有一个名为 a 的数据框,其中包含 1 个具有以下结构的变量

    Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time 
    Idle                  0   0   4    0      0    13:26:52.515     4:18:08.670
    System                4   8 148 1199   1616     0:10:14.750     4:18:08.670
    smss                388  11   2   49    336     0:00:00.109     4:18:08.597 

现在我想将数据框拆分为列名 Name、Pid、Pro、Thd、Hnd 等。

我试过 strsplit:

    df<-strsplit(a," ")

但结果就像是它们被分成了所有具有 space 的字符。 请帮忙

> dput(a)
c("Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time ", 
"Idle                  0   0   4    0      0    13:26:52.515     4:18:08.670", 
"System                4   8 148 1199   1616     0:10:14.750     4:18:08.670", 
"smss                388  11   2   49    336     0:00:00.109    4:18:08.597" )

我们可以使用read.table

  df1 <- read.table(text=a, sep='', header=TRUE, stringsAsFactors=FALSE)
  df1 
  #    Name Pid Pri Thd  Hnd
  #1   Idle   0   0   4    0
  #2 System   4   8 148 1199
  #3   smss 388  11   2   49

  str(df1)
  #'data.frame':    3 obs. of  5 variables:
  #$ Name: chr  "Idle" "System" "smss"
  #$ Pid : int  0 4 388
  #$ Pri : int  0 8 11
  #$ Thd : int  4 148 2
  #$ Hnd : int  0 1199 49

假设新的object是'a1',我们读取没有header行的(read.table)行,然后设置新数据集的列名('df2') 在使用 gsub (作为单个字符串读取)和 lookarounds 为 "CPU Time" 和 "Elapsed Time" 创建一些引号后得到 vector 的单词 scan

  df2 <- read.table(text=a1[-1], sep='', header=FALSE, 
                 stringsAsFactors=FALSE)
  colnames(df2) <-  scan(text=gsub('(?<=Time)\s|\s(?=Elapsed|CPU)',
                "'", a1[1], perl=TRUE), what='', quiet=TRUE)
  df2
  #    Name Pid Pri Thd  Hnd Priv     CPU Time Elapsed Time
  #1   Idle   0   0   4    0    0 13:26:52.515  4:18:08.670
  #2 System   4   8 148 1199 1616  0:10:14.750  4:18:08.670
  #3   smss 388  11   2   49  336  0:00:00.109  4:18:08.597

数据

  a <- c("Name                Pid Pri Thd  Hnd",
   "Idle                  0   0   4    0", 
   "System                4   8 148 1199   ", 
  "smss                388  11   2   49    "
  )