如何在R中提取特定字符串并放入另一列?

时间:2018-03-19 06:53:14

标签: r regex

我有这样的数据,下面是我的数据集中的3行:

total=7871MB;free=5711MB;used=2159MB;shared=0MB;buffers=304MB;cached=1059MB;
free=71MB;total=5751MB;shared=3159MB;used=5MB;buffers=30MB;cached=1059MB;
cached=1059MB;total=5751MB;shared=3159MB;used=5MB;buffers=30MB;free=109MB;

预期输出如下,

total   free    used     shared  buffers  cached
7871MB  5711MB  2159MB   0MB     304MB    1059MB
5751MB  71MB    5MB      3159MB  30MB     1059MB
5751MB  109MB   5MB      3159MB  30MB     1059MB

这里的问题是我想使用上述数据制作不同的列,例如total valuefree valueused valueshared value

我可以通过使用;进行拆分来实现这一点,但在其他行中,值会被洗牌,例如第一个值自由然后总计后跟其他值,

有没有办法使用REGEX,如果我们找到总值到;并放入一列,如果我们找到免费获取值到;并放入另一列?

2 个答案:

答案 0 :(得分:2)

以下是使用strsplit的一种可能性。

df <- as.data.frame(matrix(unlist(lapply(strsplit(x, ";"), strsplit, "=")), nrow = 2))
colnames(df) = df[1,]
df = df[-1,]
df

#    total   free   used shared buffers cached
# 2 7871MB 5711MB 2159MB    0MB   304MB 1059MB

修改

我不知道您的数据是如何构建的。但您可以执行以下操作:

x <- "total=7871MB;free=5711MB;used=2159MB;shared=0MB; buffers=304MB;cached=1059MB;
free=71MB;total=5751MB;shared=3159MB;used=5MB;buffers=30MB;cached=1059MB;
cached=1059MB;total=5751MB;shared=3159MB;used=5MB;buffers=30MB;free=109MB;"

x %>% str_split("\n") %>% unlist() %>% as_tibble() %>%
  mutate(total = str_extract(value, "total=(.*?)MB;"),
         free = str_extract(value, "free=(.*?)MB;"),
         used = str_extract(value, "used=(.*?)MB;"),
         shared = str_extract(value, "shared=(.*?)MB;"),
         buffers = str_extract(value, "buffers=(.*?)MB;"),
         cached = str_extract(value, "cached=(.*?)MB;")) %>%
  select(-value) %>%
  mutate_all(~as.numeric(str_extract(.,"[[:digit:]]+")))

# # A tibble: 3 x 6
#   total  free  used shared buffers cached
#   <dbl> <dbl> <dbl>  <dbl>   <dbl>  <dbl>
# 1 7871. 5711. 2159.     0.    304.  1059.
# 2 5751.   71.    5.  3159.     30.  1059.
# 3 5751.  109.    5.  3159.     30.  1059.

答案 1 :(得分:2)

我们可以尝试使用strsplit后跟sub来将数据与标签分开。然后,使用以下数据创建数据框:

x <- 'total=7871MB;free=5711MB;used=2159MB;shared=0MB;buffers=304MB;cached=1059MB;'
y <- unlist(strsplit(x, ';'))
names <- sapply(y, function(x) gsub("=.*$", "", x))
data <- sapply(y, function(x) gsub(".*=", "", x, perl=TRUE))
df <- data.frame(names=names, data=data)
df

Demo