如何对两列具有目标值的行中的值求和?

时间:2018-10-25 14:22:17

标签: r

对于包含名称(属于目标组)以及特定年份(位于另一列中)的所有行,我将如何对一列的值求和?

示例:我想对2015年的a,b,c值求和,以创建一个新的类别“ e”,并在2016年进行相同的操作。

Year Category Value
2015 a        2
2015 b        3
2015 c        2
2015 d        1
2016 a        7
2016 b        2
2016 c        1
2016 d        1

要给出类似的内容:

Year Category Value
2015 d        1
2015 e        7
2016 d        1
2016 e        10

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试 SELECT * FROM user_log WHERE user_id = 123 AND log_comment = "The one I want" AND NOT log_comment = "The one I don't want" ,首先定义一组类别。

class ListCategoriesView(generics.ListAPIView):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

    def list(self, request, *args, **kwargs)
        token = request.META.get("HTTP_TOKEN","")
        if not token:
            """ do some action here """
        elif not UserAccess.objects.filter(accessToken=token).exists():
            """ do some action here """
        else:
            return super().list(request, *args, **kwargs)

编辑。

如果您有许多类别,并且希望折叠其中一些类别,而其他类别保持原样,则CRAN包forcats函数aggregate是实现此目的的好方法。

target <- c("a", "b", "c")
group <- factor(dat$Category %in% target,
                levels = c(TRUE, FALSE),
                labels = c("e", "d"))
agg <- aggregate(Value ~ group + Year, dat, sum)[c(2, 1, 3)]

agg
#  Year group Value
#1 2015     e     7
#2 2015     d     1
#3 2016     e    10
#4 2016     d     1

然后如上fct_collapse

数据。

group <- forcats::fct_collapse(dat$Category,
                      "e" = target)
group
#[1] e e e d e e e d
#Levels: e d

答案 1 :(得分:1)

这是一个更紧凑的dplyr选项

dat %>%
        mutate(Category = ifelse(Category %in% c("a", "b", "c"), "e", # put in c() the Categories you want to sum
                                 as.character(Category))) %>%
        group_by(Year, Category) %>%
        summarise(Value = sum(Value))
# A tibble: 4 x 3
# Groups:   Year [?]
   Year Category Value
  <int>    <chr> <int>
1  2015        d     1
2  2015        e     7
3  2016        d     1
4  2016        e    10