按组计算,但不包括指定ID以下的值

时间:2017-11-09 05:03:54

标签: r

我试图摆脱这个:

#Starting df
name = c("tom", "tom", "tom", "chris", "chris", "chris", "jen", "jen", "jen") 
value = c(2,10,"end",45,"end",13,6,"end",13) 
df = data.frame(name,value) 

或此(使用NA作为截止值)

#Starting df
name = c("tom", "tom", "tom", "chris", "chris", "chris", "jen", "jen", "jen") 
value = c(2,10,NA,45,NA,13,6,NA,13) 
starting_df = data.frame(name,value) 

对此:

#Ending df
name = c("tom", "tom", "tom", "chris", "chris", "chris", "jen", "jen", "jen") 
value = c(12,12,12,45,45,45,6,6,6) 
ending_df = data.frame(name,value) 

这里的想法是按组(本例中的名称)求和,我可以使用group_by中的dplyr函数轻松完成,但我需要删除NAs下的所有值或说明end的文字。这些截止值下面的值不能包括在我的总和中。我整夜都在努力工作,而且我没有想法。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

按姓名'分组后,转换'值'到numeric(如果列为character,如果是factor,则使用as.numeric(as.character(value))),以便将非数字元素转换为NA ,然后使用whichis.na获取第一个NA元素的索引,并找到sum的'值'直到那一行

starting_df %>%
    group_by(name) %>%
    mutate(value = as.numeric(value), 
           value = sum(value[seq_len(which(is.na(value))[1])], na.rm = TRUE))
# A tibble: 9 x 2
# Groups:   name [3]
#    name value
#  <fctr> <dbl>
#1    tom    12
#2    tom    12
#3    tom    12
#4  chris    45
#5  chris    45
#6  chris    45
#7    jen     6
#8    jen     6
#9    jen     6

答案 1 :(得分:2)

基础R选项将使用ave,对于每个组(name),我们使用NA找到第一个which.max出现的索引,并加{{1}直到那个索引。

values

正如@thelatemail评论的那样,我们也可以使用starting_df$value <- ave(starting_df$value, starting_df$name, FUN = function(x) sum(x[1:which.max(is.na(x)) - 1])) starting_df # name value #1 tom 12 #2 tom 12 #3 tom 12 #4 chris 45 #5 chris 45 #6 chris 45 #7 jen 6 #8 jen 6 #9 jen 6 执行此操作。我们从每个组中选择cumsum的最大值,忽略cumsum s。

NA