我试图摆脱这个:
#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
的文字。这些截止值下面的值不能包括在我的总和中。我整夜都在努力工作,而且我没有想法。谢谢你的帮助。
答案 0 :(得分:2)
按姓名'分组后,转换'值'到numeric
(如果列为character
,如果是factor
,则使用as.numeric(as.character(value))
),以便将非数字元素转换为NA
,然后使用which
和is.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