r - 如何计算可以由 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 一起使用时,我的结果并不像我想要的那样。
所以我想要得到的结果是
- 同一个参数中的VAL个数(同样在同一个SSN中)
- 如果有任何 NA 值而不是希望将计数结果设为“0”。喜欢:
CRP SSN PARAM VAL_count
A S01 GER 0
A S01 VEG 2
A S02 GER 2
B S03 GER 1
解决方案
您可以使用sum
和is.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))
推荐阅读
- clang - 启用 LLVM 的 MemorySanitizer 是否会改变库的 ABI
- godot - Timer.start() 未按预期调用
- javascript - 如何使用 JavaScript 使所有表和数据表具有焦点?
- sql - 如何在表格中模拟 SQL 分组依据?
- gitlab - Gitlab LFS repo 更改为 NFS
- vim - Vim:处理函数 vundle#config#bundle[2] 时检测到错误。
33_check_bundle_name: - c# - 如何以编程方式停止 HostedService?
- ios - SwiftUI:如何获取设备的宽度?
- spring - 大摇大摆地从属性文件中读取文档
- html - html_attr “href” 在 rvest 中只返回一个结果