我在数据框中具有以下字符串结构作为列值:
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"
现在,我只想在每个列中保留数字。还在学习这些东西,所以不确定如何继续!非常感谢您的帮助!
答案 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
,然后使用strsplit
或read.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+"))