将字符串分成多列

时间:2019-05-22 21:28:48

标签: r string

我在数据框中具有以下字符串结构作为列值:

  

Y:10,W:3,cp:0.05

每行的数值不同,但结构保持不变。我想将此字符串分成3列,每列仅包含数字。因此,Y的一列具有相应的数值,W的另一列,而cp的最后一列。

我尝试通过以下方式使用str_split:

str_split(string,pattern = " ,",simplify = TRUE )

这显然给了我

     [,1]     [,2]   [,3]       
[1,] "Y: 40 " "W: 2" " cp: 0.05"

现在,我只想在每个列中保留数字。还在学习这些东西,所以不确定如何继续!非常感谢您的帮助!

6 个答案:

答案 0 :(得分:2)

肯定有更好的方法,但这应该可以完成工作:

现在针对具有多个元素的字符串向量进行更新,并将其放入具有三个命名列的矩阵中。应该适用于任何长度的向量。

Settings.objects.values('bb_bonus').last()

答案 1 :(得分:1)

也许不是最优雅的方法,但它可以起作用:

library(dplyr)
library(stringr)
library(tidyr)
tibble(row = c(1,2), 
       col = c("Y: 10 ,W: 3 , cp: 0.05","Y: 4 ,W: 9 , cp: 2.2")) %>%
  separate(col, into=c("col1", "col2", "col3"), sep = ",") %>%
  gather(id, col, -row) %>%
  select(-id) %>%
  mutate(col = str_trim(col)) %>%
  separate(col, into=c("letter", "number"), sep=":") %>%
  mutate(number = str_trim(number)) %>%
  spread(letter, number) %>%
  select(-row)

# A tibble: 2 x 3
  cp    W     Y    
  <chr> <chr> <chr>
1 0.05  3     10   
2 2.2   9     4   

请注意,我必须在您的数据框中添加一个名为row的新列,才能使此方法有效

答案 2 :(得分:1)

我发现有时将name: value对数据重新格式化为现有结构有助于解决复杂性。在这种情况下,我已经格式化为JSON对象,然后使用 jsonlite 中的stream_in处理数据。

这很好,因为它将自动为列命名,并且还可以在每行中都不代表每个值或顺序改变时使用。例如:

txt <- c(
  "Y: 10 ,W: 3 , cp: 0.05",
  "Y: 6 ,W: 7 , cp: 0.08",
  "cp: 0.08, Y: 6 "
)

library(jsonlite)
proctxt <- paste("{", gsub("([A-Za-z]+?):", '"\\1":', txt), "}")
stream_in(textConnection(proctxt))
# Found 3 records...
# Imported 3 records. Simplifying...
#   Y  W   cp
#1 10  3 0.05
#2  6  7 0.08
#3  6 NA 0.08

答案 3 :(得分:1)

您可以删除所有不需要的字符,例如gsub,然后使用strsplitread.csv。 在 base 中,它看起来像:

string <- c("Y: 10 ,W: 3 , cp: 0.05", "Y: 10 ,W: 3 , cp: 0.05")
read.csv(text=gsub("[[:alpha:]: ]", "", string), header=FALSE)
#  V1 V2   V3
#1 10  3 0.05
#2 10  3 0.05

#or with strsplit
strsplit(gsub("[[:alpha:]: ]", "", string), ",")

答案 4 :(得分:0)

鉴于您的文本字符串是统一的,因此应该相对简单些,第一部分如下所示:

txt <- c(
  "Y: 10 ,W: 3 , cp: 0.05",
  "Y: 6 ,W: 7 , cp: 0.08",
  "Y: 5 ,W: 0 , cp: 0.08"
)

x <- do.call(rbind, strsplit(txt, split = " ,"))

那将得到您的“标签:值”矩阵

library(stringr)
y <- matrix(data = str_extract(string = x,
                               pattern = "([0-9.]+)"),
            ncol = ncol(x))

如果需要,将使您输入表示值的文本字符串,只需使用str_extract()而不用调用矩阵即可将值作为向量,并且:

z <- matrix(data = as.numeric(y),
            ncol = ncol(x))

将为您提供矩阵作为数字,听起来像是您感兴趣的矩阵。

所有内容都非常整洁,并且没有中间矩阵调用,如果不需要的话,它看起来像:

library(stringr)
txt <- c(
  "Y: 10 ,W: 3 , cp: 0.05",
  "Y: 6 ,W: 7 , cp: 0.08",
  "Y: 5 ,W: 0 , cp: 0.08"
)

x <- do.call(rbind, strsplit(txt, split = " ,"))
y <- str_extract(string = x,
                 pattern = "([0-9.]+)")
z <- matrix(data = as.numeric(y),
            ncol = ncol(x))

使用z给您一个数字矩阵。

答案 5 :(得分:0)

我认为这应该有效:

library(tidyverse)


string <- c("Y: 10 ,W: 3 , cp: 0.05","Y: 4 ,W: 9 , cp: 2.2")


dat <- tibble(x = string) %>% 
  separate(x,c("Y","W","cp"), sep = " ,")


dat2 <- dat %>% mutate_all(., ~str_remove(.,"\\D+"))