我在数据框中有一个列如下所示:
[1] [0.50 .. 0.52] [0.52 .. 0.54] [0.54 .. 0.56] [0.56 .. 0.58]
[5] [0.58 .. 0.60] [0.60 .. 0.62] [0.62 .. 0.64] [0.64 .. 0.66]
[9] [0.66 .. 0.68] [0.68 .. 0.70] [0.70 .. 0.72] [0.72 .. 0.74]
[13] [0.74 .. 0.76] [0.76 .. 0.78] [0.78 .. 0.80] [0.80 .. 0.82]
我想取这一栏中两个数字的平均值。但是,我不知道该怎么做。我尝试使用gsub()来替换“..”但我无法删除括号,我似乎无法找到一种方法来提取数字。获得这些数字的平均值的最佳方法是什么?
答案 0 :(得分:4)
您可以将R(gsub,regexp,...)中的regex base 函数或 stringr 包用于 str_extract )。
require(stringr)
string <- c("[0.50 .. 0.52]", "[0.52 .. 0.54]", "[0.54 .. 0.56]", "[0.56 .. 0.58]")
number <- as.numeric(str_extract(string, "\\d\\.\\d+"))
number
[1] 0.50 0.52 0.54 0.56
然后你可以计算1到2,3和4之间的平均值,用于动物园
中的 rollmean 功能require(zoo)
average <- rollmean(number, 2)
average[as.logical(seq_along(average) %%2 )]
[1] 0.51 0.55
答案 1 :(得分:4)
使用gsub
取出括号(记住要为它们加倍转义),然后使用strsplit
分隔数字,sapply
使用{{mean
生成结果列表1}}和as.numeric
:
x <- c("[0.52 .. 0.54]", "[0.54 .. 0.56]")
sapply(strsplit(gsub("[\\[\\]]","",x,perl=T)," .. "),function(x) mean(as.numeric(x)))
[1] 0.53 0.55
答案 2 :(得分:3)
使用gsub
将空格替换为特殊字符。然后strsplit
并取mean
:
首先复制数据:
x <- scan(what="character", quote='"', sep=" ", text='"[0.50 .. 0.52]" "[0.52 .. 0.54]" "[0.54 .. 0.56]" "[0.56 .. 0.58]" "[0.58 .. 0.60]" "[0.60 .. 0.62]" "[0.62 .. 0.64]" "[0.64 .. 0.66]" "[0.66 .. 0.68]" "[0.68 .. 0.70]" "[0.70 .. 0.72]" "[0.72 .. 0.74]" "[0.74 .. 0.76]" "[0.76 .. 0.78]" "[0.78 .. 0.80]" "[0.80 .. 0.82]"')
然后将gsub
与sapply
和mean
:
xx <- gsub("\\[|\\.\\.|\\]", "", x)
sapply(strsplit(xx, " "), function(x)mean(as.numeric(x)))
结果:
[1] 0.51 0.53 0.55 0.57 0.59 0.61 0.63 0.65 0.67 0.69 0.71 0.73 0.75 0.77 ...
正则表达式的工作原理如下:
[ ]
表示替换括号内的任何文字[
和]
,但由于它们在正则表达式中有意义,因此您需要转义这些括号,即\\[
和\\]
|
表示与逻辑OR
相同,即找到括号或双倍期您可以在?regexp
或?gsub
了解有关R中常规表达的详情。