0

我在数据框中有一列看起来像这样:

[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() 替换“ .. ”,但我无法删除括号,而且我似乎找不到仅提取数字的方法。获得这些数字的平均值的最佳方法是什么?

4

3 回答 3

4

您可以使用 R 中的正则表达式的基本函数(gsub、regexp、...)或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

然后,您可以使用zoo中的rollmean函数计算 1 和 2、3 和 4 之间的平均值

require(zoo)
average <- rollmean(number, 2)
average[as.logical(seq_along(average) %%2 )]
[1] 0.51 0.55
于 2012-07-19T11:02:21.797 回答
4

用于gsub取出括号(记住为它们进行双重转义),然后用于strsplit分隔数字,并使用andsapply处理结果列表:meanas.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
于 2012-07-19T11:09:27.813 回答
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使用sapplyand 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您可以在或处阅读更多关于 R 中正则表达式的信息?gsub

于 2012-07-19T11:10:02.927 回答