Разбить строку на столбцы в R - PullRequest
3 голосов
/ 25 марта 2020

У меня есть строка

mat <- c("[('value-66 > 0.03', 0.1314460), ('0.03 < value-222 <= 0.06', -0.062805), ('0.01 < value-93 <= 0.03', -0.058007), ('value-141 > 0.05', -0.051339234), ('value-108 <= 0.01', -0.0373), ('value-303 > 0.02', 0.037257)]") 

Я хочу разделить значения каждой скобки на три столбца.

Для первого примера окончательная матрица будет содержать три столбца:

value-66, > 0.03, 0.1314460

Моя сложность заключается в следующем примере:

'0.01 < value-93 <= 0.03', -0.058007

Я не нашел решение поместить его в три столбца, например:

value-93, 0.01 <  <= 0.03, -0.058007

Я пробовал это, но это не правильно обрезать

s <- strsplit(mat, ",")
s1 <- lapply(s, function(x) trimws(x,which=c('both')))
s1 <- lapply(s1, function(x) strsplit(x,' '))

Нужно ли устанавливать условия в al oop?

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Вам не нужна функция al oop.

Попробуйте:

library(stringr)

mat <- c("[('value-66 > 0.03', 0.1314460), ('0.03 < value-222 <= 0.06', -0.062805), ('0.01 < value-93 <= 0.03', -0.058007), ('value-141 > 0.05', -0.051339234), ('value-108 <= 0.01', -0.0373), ('value-303 > 0.02', 0.037257)]") 

mat %>%
  str_extract_all("\\(.+?\\)") %>%
  sapply(str_remove_all, "\\(|\\)|\\'") %>%
  as.character() %>%
  str_split(",") %>%
  (
    function(i){
      c12 <- sapply(i, "[[", 1)
      c1 <- str_extract(c12, "value[^ ]+")
      c2 <- str_remove(c12, c1)
      c3 <- sapply(i, "[[", 2)
      cbind(c1, c2, c3)
    }
  )
     c1          c2                c3             
[1,] "value-66"  " > 0.03"         " 0.1314460"   
[2,] "value-222" "0.03 <  <= 0.06" " -0.062805"   
[3,] "value-93"  "0.01 <  <= 0.03" " -0.058007"   
[4,] "value-141" " > 0.05"         " -0.051339234"
[5,] "value-108" " <= 0.01"        " -0.0373"     
[6,] "value-303" " > 0.02"         " 0.037257"  

stringr - мой любимый инструмент для работы со строками, включая regex. Это соответствует, и функции легче запомнить. Тем не менее, вы можете использовать базовую функцию R, если хотите.

2 голосов
/ 25 марта 2020

Вам не понадобятся петли, просто некоторые regex. Вот как можно решить эту проблему с помощью только базовых функций r. Я бы порекомендовал посмотреть stringr, но я думаю, что важно изучить базовую версию R, если вы только начинаете. Я также разбил каждый шаг для ясности, но есть способы объединить этот код в меньшее количество шагов.

Обратите внимание, как значения организованы в наборы скобок, так что проще всего разбить строку, используя этот шаблон.

# Remove brackets
s <- gsub("\\[|\\]", "", mat)

# Extract strings within parentheses
grx <- gregexpr("\\(.+?\\)",  s)
rows <- do.call(c, regmatches(s, grx))

# Remove parentheses
rows <- gsub("\\(|\\)", "", rows)
# Remove quotes
rows <- gsub("\\'", "", rows)

# Split by comma
df <- as.data.frame(do.call(rbind, strsplit(rows, ",")), stringsAsFactors = F)  

# Extract values
grx <- "(?<=value\\-)[0-9.]+"
vals <- gregexpr(grx, df$V1, perl = TRUE)
df$V3 <- paste0("value-", as.numeric(unlist(regmatches(df$V1, vals))))


df
                        V1            V2        V3
1          value-66 > 0.03     0.1314460  value-66
2 0.03 < value-222 <= 0.06     -0.062805 value-222
3  0.01 < value-93 <= 0.03     -0.058007  value-93
4         value-141 > 0.05  -0.051339234 value-141
5        value-108 <= 0.01       -0.0373 value-108
6         value-303 > 0.02      0.037257 value-303

Я не делал последний шаг по удалению «значения-XX» из строки, отчасти потому, что не понимаю, зачем вам такой столбец. Я позволю вам заняться этим, попробуйте использовать gsub для этого. Вы даете фрейму данных любые имена столбцов, которые хотите.

...