拆分数据框中的列

时间:2015-08-10 09:56:52

标签: r dataframe text-mining

我有一个名为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 

现在我想将数据框拆分为名称,Pid,Pro,Thd,Hnd等名称的列。

我试过strsplit:

    df<-strsplit(a," ")

但结果就好像它们被分成了所有那些有空格的角色。 请帮忙

> 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" )

1 个答案:

答案 0 :(得分:1)

我们可以使用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

假设新对象为'a1',我们读取没有标题行的行(read.table),然后在为“CPU”创建一些引号后设置新数据集('df2')的列名称时间“和”经过时间“使用gsub(将作为单个字符串读取)与lookarounds一起使用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    "
  )