【问题标题】:Get multiple sums for a vector including many factor-levels devided by NA's获取向量的多个总和,包括许多因子级别除以 NA
【发布时间】:2019-01-16 12:55:35
【问题描述】:

希望有人可以帮助我解决以下问题:

我有一个非常大的向量 (105264),其形式如下。 一组值,后跟一组 NA,然后是一组值(依此类推)。

c(123, 4525, 4365, 234, 674, NA, NA, NA, NA, NA, NA, NA, 24, 347, 457, 3246, 234, 5, 346, NA, NA, NA, NA, NA, NA, [... and so on])

有什么方法可以让我得到由我的 NA 分隔的每个值的总和?值和 NA 在向量上的长度是分开的,这就是我看到问题的地方......

非常感谢您的回复!

最好的问候, 最大

【问题讨论】:

  • 您好,您在以下解决方案中遇到任何问题吗?您似乎没有接受答案。

标签: r vector sum


【解决方案1】:

创建一个虚拟数据

num <- c(3, 5, 2, NA, NA, 2, 3, 7, 8, NA, 2, 3, NA, 5, 4)

假设我已经理解你想要什么,你想要c(3, 5, 2)c(2, 3, 7) 组的总和,由NAs 分隔

我们可以使用tapply

new <- tapply(num, cumsum(is.na(num)) , sum, na.rm = TRUE)
new

# 0  1  2  3  4 
#10  0 20  5  9 

然后我们可以忽略其中包含 0 的组。

new[new != 0]
# 0  2  3  4 
#10 20  5  9 

分组变量的创建可视为

is.na(num)
#[1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE
#[14] FALSE FALSE

cumsum(is.na(num))
#[1] 0 0 0 1 2 2 2 2 2 3 3 3 4 4 4

【讨论】:

  • 非常感谢!我对如何在这个网站上获得有用的答案感到不知所措!你是一个很棒的社区!!! :-)
【解决方案2】:

这是base R 中的rle 选项。用rle创建分组变量,并用它来得到tapply的原始向量的非NA相邻元素的sum

grp <- with(rle(!is.na(num)), rep(seq_along(values), lengths))
i1 <- !is.na(num)
tapply(num[i1], grp[i1], FUN = sum, na.rm  = TRUE)
#   1    3 
#9921 4659 

数据

num <- c(123, 4525, 4365, 234, 674, NA, NA, NA, NA, NA, NA, NA, 24, 
   347, 457, 3246, 234, 5, 346, NA, NA, NA, NA, NA, NA)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多