如何从R中读取linux进程状态(ps)命令的输出?

时间:2013-01-21 03:20:37

标签: r memory io system text-formatting

这是data.txt:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND  
root         1  0.0  0.0   2280   728 ?        Ss   20:44   0:00 init [2]    
root         2  0.0  0.0      0     0 ?        S    20:44   0:00 [kthreadd]  
root       202  0.0  0.0      0     0 ?        S<   20:44   0:00 [ext4-dio-unwri  
root       334  0.0  0.1   2916  1452 ?        Ss   20:44   0:00 udevd --daemon  

如何将数据读入data.frame?
1.不能决定分隔符
最后一个字段是个问题,space不能是分隔符,
init [2],udevd - daemon是一个字段,不能用space分隔 2.没有固定宽度
每条线都有不同的宽度。

那么,如何将data.txt读入data.frame?

3 个答案:

答案 0 :(得分:4)

我会这样做:

library(stringr) # has a convenient function for splitting to a fixed length 

raw          <- system("ps aux", intern = TRUE)
fields       <- strsplit(raw[1], " +")[[1]]
ps           <- str_split_fixed(raw[-1], " +", n = length(fields))
colnames(ps) <- fields

答案 1 :(得分:2)

这是一个可以解决这个问题的单线程序:

do.call(rbind, lapply(strsplit(readLines("data.txt"), "\\s+"), function(fields) c(fields[1:10], paste(fields[-(1:10)], collapse = " "))))

这就是它的详细内容:

  1. 通过readLines读取文件的所有行(得到一个字符向量,其中每个向量元素是文件的一行)

  2. 使用strsplit将每一行拆分为由空格分隔的条带(\\s+

  3. 对于每一行(lapply),将第10个字段之后的所有字段合并为一个(通过paste(..., collapse = " "))---这会创建一个列表,其中每个列表元素代表一行该文件是一个长度为11的字符向量(每个字段一个)

  4. 最后,调用rbind将列表合并到矩阵(或数据框)

答案 2 :(得分:0)

您的数据采用何种格式?如果您可以在Excel中打开它,将其保存为制表符分区文件很可能是继续前进的最佳方式。

将文件保存为制表符分隔文件是准备导入R数据的常用方法之一。这可以通过'另存为'.txt(tab deliminated)'在Excel中完成。完成后:

my_data <- read.table("path/to/file/", header = TRUE, sep = "\t")

sep = "\t"告诉R您的文件已标记为