我正在调整数据,具体来说,我打开了这个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吗? (或者我是否需要穿过连字符,组合成一个向量并返回均值?)。
答案 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