R总和列中的值,但排除较少的特定值

时间:2017-07-20 15:26:49

标签: r

我有以下数据:

>str(Maximum)
num [1:6] 1.4  1.07  1.89  0.342  0.00  1.998

我想总结所有这些值,但在第二和第三,第四和第五之间,只有更大的值。所以在这种情况下,我正在寻找1.4 + 1.89 + 0.342 + 1.998。我将如何在R代码中执行此操作?

4 个答案:

答案 0 :(得分:4)

第一个元素,加上最大值(2,3)加上最大值(4,5)+第6个元素。

maximum[1] + max(maximum[2:3]) + max(maximum[4:5]) + maximum[6]

答案 1 :(得分:3)

如果你的向量Maximum总是有6个元素,弗洛里安的回答是最简单的方法。但是如果你的矢量更长,你可以这样做:

z1 = Maximum[seq(from = 2, to = length(Maximum)-1, by = 2)]
z2 = Maximum[seq(from = 3, to = length(Maximum)-1, by = 2)]
z3 = ifelse(z1>z2, z1, z2)
result = Maximum[1] + sum(z3) + Maximum[length(Maximum)]

例如:

Maximum = floor(runif(22, 1, 100))
> Maximum
 [1] 96  6  1 10 90 15 58 48 94 97 78 95 42 79 61 25 61 74 93 37 44 22

z1将是偶数索引(不包括末尾)的元素:

> z1
 [1]  6 10 15 48 97 95 79 25 74 37

z2奇数索引处的元素(不包括末尾):

> z2
 [1]  1 90 58 94 78 42 61 61 93 44

和z3每个索引的z1和z2之间的最大值:

> z3
 [1]  6 90 58 94 97 95 79 61 93 44

然后通过添加z3以及Maximum

的开头和结尾来计算结果

注意:最大向量应具有偶数个元素。

答案 2 :(得分:2)

您可以使用<vector.name>[<positions>]指定向量中的位置。此外,您可以使用-指定要跳过的位置。因此,

Maximum <- c(1.4, 1.07, 1.89, 0.342, 0.00, 1.998)
Maximum[-c(2,5)]
# [1] 1.400 1.890 0.342 1.998
sum( Maximum[-c(2,5)] )
# [1] 5.63

答案 3 :(得分:1)

这里常用的方法是使用tapply执行&#34;群组操作&#34;然后汇总中间值。

vec <- c(1.4, 1.07, 1.89, 0.342, 0.00, 1.998)
group <- c(1, 2, 2, 3, 3, 4)

此处,计算每组的最大值

 tapply(vec, group, max)
    1     2     3     4 
1.400 1.890 0.342 1.998 

然后你可以对结果值求和

sum(tapply(vec, group, max))
[1] 5.63

动态构建组变量的一种方法是使用rep这样的几次。

reps <- c(1, rep(2, (length(vec) / 2) - 1), 1)
rep(seq_along(reps), reps)
[1] 1 2 2 3 3 4