2016-08-13 5 views
1

Ich versuche, einige Zahlen aus einer Zeichenfolge (Kommentare) basierend auf einem bestimmten Kriterium zu extrahieren. Die Zahlen, die ich direkt extrahieren möchte, folgen einem Datum im 24-Stunden-Format und enthalten immer eine Dezimalstelle und sind kleiner als 20 (es gibt andere Zahlen in der Zeichenfolge, aber ich bin nicht daran interessiert). Ich habe es geschafft, die Zahlen, die ich möchte, mit dem R-Code unten zu extrahieren, aber ich habe keine Möglichkeit, diese zurück zu den IDs zu bringen, von denen sie kamen. Einige IDs haben mehrere Zahlen von Interesse, während einige nur eine haben. Zum Beispiel brauche ich eine Möglichkeit, die ID-Nummer in den unten angegebenen Dummy-Daten mit jeder Anzahl von Interesse zu verknüpfen. Wie Sie sehen können, enthält ID 1 drei interessante Ergebnisse (4.1, 6.9 und 4.3), während ID 2 nur 1 interessierendes Ergebnis enthält (6.5).Extrahieren von Zahlen aus Zeichenfolge in R basierend auf einem bestimmten Kriterium

Jede Hilfe wäre fantastisch!

(An example of the format of comment.txt) 

    ID comments 
    1 abc1200 4.1 abc1100 6.9 etd1130 4.3 69.0 
    2 abc0900 6.5 abcde 15 
    3 3.2 0850 9.5 abc 8.2 0930 12.2 agft 75.0 
    4 ashdfalsk 0950 10.5 dvvxcvszv asdasd assdas d 75.0 


#rm(list=ls(all=TRUE)) 

#import text and pull out a list of all numbers contained withtin the free text 
raw_text <- read.delim("comment.txt") 
numbers_from_text <- gregexpr("[0-9]+.[0-9]", raw_text$comments) 

numbers_list <- unlist(regmatches(raw_text$comments, numbers_from_text)) 
numbers_list <- as.data.frame(numbers_list) 

#pull out those numbers that contain an decimal place and create a running count 
format<-cbind(numbers_list,dem=(grepl("\\.",as.character(numbers_list$numbers_list)))*1,row.number=1:nrow(numbers_list)) 

#if the number does not contain a decimal (a date) then create a new row number which is the addition of the first row 
#else return NA 
test <- cbind(format,new_row = ifelse(format$dem==0, format$row.number+1, "NA")) 

#match the cases where the new_row is equal to the row.number and then output the corresponding numbers_list 
match <-test$numbers_list[match(test$new_row,test$row.number)] 

#get rid of the NA's for where there wasnt a match and values less than 20 to ensure results are correct 
match_NA <- subset(match, match!= "<NA>" & as.numeric(as.character(match))<20) 

match_NA <- as.data.frame(match_NA) 

Antwort

0

Etwas wie dies scheint, zu arbeiten Numerik beginnend mit einem leeren passenden, das eine Periode enthalten, dann in numerische und Extrahieren Umwandeln welche sind weniger als 20

library(stringr) 
temp <- apply(comments, 1, function(x) { 
    str_extract_all(x,"[[:blank:]][0-9]+[.][0-9]") 
}) 

library(purrr) 
temp <- lapply(flatten(temp), function(x) as.numeric(str_trim(x))) 
lapply(temp, function(x) x[x <20]) 

[[1]] 
[1] 4.1 6.9 4.3 

[[2]] 
[1] 6.5 

[[3]] 
[1] 3.2 9.5 8.2 12.2 

[[4]] 
[1] 10.5 
Verwandte Themen