替换计算结果

时间:2014-12-15 12:04:46

标签: r mean gsub strsplit

我正在调整数据,具体来说,我打开了这个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

将其粘贴到记事本中并将其保存为txt文件。

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吗? (或者我是否需要穿过连字符,组合成一个向量并返回均值?)。

4 个答案:

答案 0 :(得分: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

免责声明:只有当每列中的范围都相同时(如样本数据中一样)才能正常工作

答案 1 :(得分: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

答案 2 :(得分: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 

答案 3 :(得分: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