2014-12-15 3 views
6

Я munging данных, в частности, я открыл этот PDF http://pubs.acs.org/doi/suppl/10.1021/ja105035r/suppl_file/ja105035r_si_001.pdf и соскабливаю данные из таблицы s4,Подставляя результаты расчета

1a 1b 1a 1b 
1 5.27 4.76 5.09 4.75 
2 2.47 2.74 2.77 2.80 
4 1.14 1.38 1.12 1.02 
6 7.43 7.35 7.22-7.35a 7.25-7.36a 
7 7.38 7.34 7.22-7.35a 7.25-7.36a 
8 7.23 7.20 7.22-7.35a 7.25-7.36a 
9(R) 4.16 3.89 4.12b 4.18b 
9(S) 4.16 3.92 4.12b 4.18b 
10 1.19 0.91 1.21 1.25 

вставить его в блокнот и сохранил его как текстовый файл ,

s4 <- read.table("s4.txt", header=TRUE, stringsAsFactors=FALSE) 

дает,

X1a X1b  X1a.1  X1b.1 
1 5.27 4.76  5.09  4.75 
2 2.47 2.74  2.77  2.80 
4 1.14 1.38  1.12  1.02 
6 7.43 7.35 7.22-7.35a 7.25-7.36a 
7 7.38 7.34 7.22-7.35a 7.25-7.36a 
8 7.23 7.20 7.22-7.35a 7.25-7.36a 

для того, чтобы использовать данные мне нужно изменить все это числовой и удалить буквы, благодаря этой ссылке R regex gsub separate letters and numbers я могу использовать следующий код,

gsub("([[:alpha:]])","",s4[,3]) 

Я могу избавиться от посторонних букв.

То, что я хочу сделать сейчас, и точка вопроса, является изменение диапазонов,

"7.22-7.35" "7.22-7.35" "7.22-7.35" 

с их помощью,

"7.29" 

Могу ли я использовать GSUB для этого? (или мне понадобится strsplit через дефис, объединить в вектор и вернуть среднее?).

ответ

3

Вам нужно одно регулярное выражение в strsplit для выполнения этой задачи (удаление буквы и расщепление):

s4[] <- lapply(s4, function(x) { 
    if (is.numeric(x)) x 
    else sapply(strsplit(as.character(x), "-|[[:alpha:]]"), 
       function(y) mean(as.numeric(y))) 
}) 

Результат:

> s4 
    X1a X1b X1a.1 X1b.1 
1 5.27 4.76 5.090 4.750 
2 2.47 2.74 2.770 2.800 
4 1.14 1.38 1.120 1.020 
6 7.43 7.35 7.285 7.305 
7 7.38 7.34 7.285 7.305 
8 7.23 7.20 7.285 7.305 
+0

спасибо (и спасибо другим участникам) некоторые полезные советы – user1945827

2

что-то подобное:

mean(as.numeric(unlist(strsplit("7.22-7.35","-")))) 

должны работать (и соответствует тому, что вы имели в виду, я думаю)

или вы можете сделать:

eval(parse(text=paste0("mean(c(",gsub("-",",","7.22-7.35"),"))"))) 

, но я не уверен, что это проще ...

Чтобы применить его к вектору:

vec<-c("7.22-7.35","7.22-7.35") 

1st solution : sapply(vec, function(x) mean(as.numeric(unlist(strsplit(x,"-"))))) 
2nd solution : sapply(vec, function(x) eval(parse(text=paste0("mean(c(",gsub("-",",",x),"))")))) 

В обоих случаях вы получите:

7.22-7.35 7.22-7.35 
    7.285  7.285 
+0

@DavidArenburg, просто используя sapply в комбинации он будет ... – Cath

+0

Я знаю, что вы можете использовать 'sapply' ...В любом случае, похоже, что у OP все свои диапазоны одинаковы в любом случае –

3

Вот такой подход, который, кажется, работает прямо на данных образца:

df[] <- lapply(df, function(col){ 
    col <- gsub("([[:alpha:]])","", col) 
    col <- ifelse(grepl("-", col), mean(as.numeric(unlist(strsplit(col[grepl("-", col)], "-")))), col) 
    as.numeric(col) 
}) 

> df 
# X1a X1b X1a.1 X1b.1 
#1 5.27 4.76 5.090 4.750 
#2 2.47 2.74 2.770 2.800 
#4 1.14 1.38 1.120 1.020 
#6 7.43 7.35 7.285 7.305 
#7 7.38 7.34 7.285 7.305 
#8 7.23 7.20 7.285 7.305 

Отказ от ответственности: Это работает только право если диапазоны в каждом столбце все одинаковы (как в данных выборки)

0

Кроме того,

library(gsubfn) 
indx <- !sapply(s4, is.numeric) 
s4[indx] <- lapply(s4[indx], function(x) 
      sapply(strapply(x, '([0-9.]+)', ~as.numeric(x)), mean)) 

s4 
# X1a X1b X1a.1 X1b.1 
#1 5.27 4.76 5.090 4.750 
#2 2.47 2.74 2.770 2.800 
#4 1.14 1.38 1.120 1.020 
#6 7.43 7.35 7.285 7.305 
#7 7.38 7.34 7.285 7.305 
#8 7.23 7.20 7.285 7.305 
Смежные вопросы