当前位置: 首页 > 知识库问答 >
问题:

如何按组计算计数,然后每组只保留一个

阎丰羽
2023-03-14
data <- data.frame(val=c(rep(6,10), rep(7, 15), rep(8, 20), rep(9, 25), rep(10, 100), rep(11, 20), rep(12, 15), rep(13, 10)))
data$plus <- data$val + 100
table <- table(data$val)
df1 <- data.frame(val = as.integer(names(table)[1:length(table)]), N = table[1:length(table)])
df2 <- merge(data, df1)
df3 <- do.call(rbind, by(df2, list(df2$val), FUN=function(x) head(x, 1)))
bys val plus: egen max = _N
bys val plus: gen first = _n==1
keep if first==1

有没有一种方法可以简化或使R代码更优雅?

共有1个答案

上官树
2023-03-14

下面是一个使用“data.table”的方法:

library(data.table)
as.data.table(data)[, N := .N, by = val][, .SD[1], by = val]
#    val plus   N
# 1:   6  106  10
# 2:   7  107  15
# 3:   8  108  20
# 4:   9  109  25
# 5:  10  110 100
# 6:  11  111  20
# 7:  12  112  15
# 8:  13  113  10

## Or (@RicardoSaporta)
as.data.table(data)[, list(.N, plus=plus[1]), by = val]

## Or (@DavidArenburg)
unique(as.data.table(data)[, N := .N, by = val], by = "val")

使用“dplyr”,您可以尝试:

library(dplyr)

data %>%
  group_by(val) %>%
  mutate(N = n()) %>%
  slice(1)

在底座R中,我想你可以尝试这样的方法:

do.call(rbind, lapply(split(data, data$val), 
                      function(x) cbind(x, N = nrow(x))[1, ]))
 类似资料:
  • 这是我之前问题的后续:如何提取每个组的前n行并使用该子集计算函数? 另一篇相关文章:如何提取每组的前n行? 我有以下数据: 我想在特定索引处按组对这些数据应用一个函数,其中函数输出取决于子集化的数据帧。然后,我想用不同的分组变量对结果data.table进行分组,并取一个简单的平均值。 我是否希望首先在子集化的行上按组1计算我的函数,r bind列出结果,然后按组2计算平均值? 还是我想先rbin

  • 我有一个任务来做一个函数,它只接收一个整数和一个整数列表(不能添加任何其他内容)。它应该返回列表中求和为k的组合数,顺序无关紧要(硬币更换问题)。另外,我需要使用递归。我是这么做的: 问题是它将同一个组合求和多次。例如 返回9。 它应该返回4(1111111221112,5)。

  • 问题内容: 我需要在每笔 数据中都计算唯一值 我尝试 但是我想得到 问题答案: 您需要: 如果需要字符: 或正如乔恩所说: 您可以像这样保留列名: 区别在于返回一个Series并返回一个DataFrame。

  • 问题内容: 我正在尝试计算由文本字段接收的输入填充的数组的总数,均值和中位数。我设法算出了总数和均值,但我只是无法获得中位数。我认为在执行此操作之前需要对数组进行排序,但是我不确定如何执行此操作。这是问题吗,还是我没有找到另一个问题?这是我的代码: 问题答案: Java中的Arrays类具有静态的排序功能,您可以使用调用该功能。

  • 我试图计算由TextField接收的输入填充的数组的总数、平均值和中位数。我已经算出了总数和平均数,但中位数无法计算出来。我认为在我可以这样做之前需要对数组进行排序,但我不确定如何这样做。是这个问题,还是还有一个我没有找到的?下面是我的代码:

  • 我有以下数据帧(示例): 我想创建一个名为“斜率”的列,它显示每组每n(n=3)天的斜率。这意味着当第一个日期是“2022-09-01”和3天后用于计算时。斜率可以使用“diff_days”(通过与每组第一个值的差异计算)和“值”列来计算。以下是所需的输出: 以下是一些示例计算,可为您提供一个想法: A组前3天:斜率([0,1,3],[2,1,3])=0.43 A组3天后:斜率([5,6,6],[