R — возврат к числам из вырезания

#r #string #list #cut

#r #строка #Список #вырезать

Вопрос:

У меня есть таблица с сокращениями в интервалах, таких как:

     bin targets casos   prop phyp      logit
(-2,-1]     193  6144 0.0314    0 -3.4286244
  (-1,3]     128   431 0.2970    1 -0.8617025
 (3,11]     137   245 0.5592    1  0.2378497
  

Я хочу получить исходные сокращения. Я пытался с:

 a<-strsplit(as.character(pl$table[,'bin']), ' ')
  

И затем я попытался разделить каждую строку с:

 lapply(a, function(x) strsplit(x, ",")[1] )
  

Но я не получаю ожидаемого результата, который:

 (-1,3,11)
  

Есть ли лучший способ добиться этого? Что еще мне нужно сделать, чтобы получить результат?

Спасибо.

Комментарии:

1. unlist(lapply(strsplit(df$bin, ","), function(x) max(as.numeric(gsub("\(|]", "", x)))))

Ответ №1:

Если ваши данные постоянно находятся в этом формате, вы могли бы использовать gsub() .

 df <- data.frame(bin = c('(-2,-1]','(1,3]','(3,11]'),
                 targets = c(193, 128, 137), 
                 casos = c(6144, 431, 245),
                 prop = c(0.0314, 0.297, 0.5592),
                 phyp = c(0,1,1),
                 logit = c(-3.4286244,-0.8617025, 0.2378497), stringsAsFactors = F)

a <- strsplit(df$bin, ',')
sapply(a, function(x) gsub("]", "", x))[2,]
sapply(a, function(x) gsub("\(", "", x))[1,]
  

Что дает вам

 [1] "-1" "3"  "11"
[1] "-2" "1"  "3" 
  

Ответ №2:

В вашем примере границ больше, чем, по вашим словам, вы надеетесь получить. Это даст вам все границы:

 d <- read.table(text='    bin targets casos   prop phyp      logit
"(-2,-1]"     193  6144 0.0314    0 -3.4286244
  "(1,3]"     128   431 0.2970    1 -0.8617025
 "(3,11]"     137   245 0.5592    1  0.2378497', header=T)

strings <- as.character(levels(d$bin))
strings <- substr(strings, 2, nchar(strings)-1)
unique(unlist(strsplit(strings, ",")))
# [1] "-2" "-1" "1"  "3"  "11"
  

Если вам нужны были только верхние границы, это сработает:

 strings <- as.character(levels(d$bin))
strings <- sapply(strsplit(strings, ","), function(l){ l[2] })
strings <- substr(strings, 1, nchar(strings)-1)
unique(strings)
# [1] "-1" "3"  "11"
  

Комментарии:

1. Спасибо. Я понял это и изменил это в примере.

Ответ №3:

Другим способом было бы:

 a<-strsplit(as.character(pl$table[,'bin']), ' ')
lapply(a, function(x) unlist(strsplit(x, ",|]"))[2])