首页 > 解决方案 > 如何计算可以由 R 中的其他列分组的值

问题描述

我还是这个 R 程序的新手,并且一直在玩这个程序。我在计算值时遇到了麻烦。

我正在尝试计算可以按其他列分组的行,但我找不到方法。

我的数据是这样的

CRP SSN PLT PARAM VAL
A   S01 1   GER   NA
A   S01 2   GER   NA
A   S01 1   VEG   40
A   S01 2   VEG   41
A   S02 1   GER   100
A   S02 2   GER   90
B   S03 1   GER   90

它有这样的数据框并且有 720obs。5 个变量。我必须计算 val 但是当我尝试将聚合或 n() 与 group by 一起使用时,我的结果并不像我想要的那样。

所以我想要得到的结果是

  1. 同一个参数中的VAL个数(同样在同一个SSN中)
  2. 如果有任何 NA 值而不是希望将计数结果设为“0”。喜欢:
    CRP SSN PARAM VAL_count
    A   S01 GER   0
    A   S01 VEG   2
    A   S02 GER   2
    B   S03 GER   1

标签: r

解决方案


您可以使用sumis.na来计算每组中的行数。

library(dplyr)
result <- df %>% 
           group_by(CRP,SSN, PARAM) %>% 
           summarise(VAL_count = sum(!is.na(VAL)), .groups = 'drop')
result
#  CRP   SSN   PARAM VAL_count
#  <chr> <chr> <chr>     <int>
#1 A     S01   GER           0
#2 A     S01   VEG           2
#3 A     S02   GER           2
#4 B     S03   GER           1

我们也可以在基础 R 和data.table.

#Base R
aggregate(VAL~CRP + SSN + PARAM, df, function(x) sum(!is.na(x)), na.action = 'na.pass')

#data.table
library(data.table)
setDT(df)[, .(VAL_count = sum(!is.na(VAL))), .(CRP ,SSN ,PARAM)]

数据

如果您以可重现的格式提供数据,则更容易提供帮助

df <- structure(list(CRP = c("A", "A", "A", "A", "A", "A", "B"), SSN = c("S01", 
"S01", "S01", "S01", "S02", "S02", "S03"), PLT = c(1L, 2L, 1L, 
2L, 1L, 2L, 1L), PARAM = c("GER", "GER", "VEG", "VEG", "GER", 
"GER", "GER"), VAL = c(NA, NA, 40L, 41L, 100L, 90L, 90L)), 
class = "data.frame", row.names = c(NA, -7L))

推荐阅读