【问题标题】:How to use aggregate( ) to count NA values and using tapply() as an alternative如何使用 aggregate() 计算 NA 值并使用 tapply() 作为替代
【发布时间】:2017-12-09 22:29:28
【问题描述】:

我是 R 新手,正在努力准备一周后的 R 考试。

在一个家庭作业问题上,我试图以尽可能多的方式解决一个问题(准备更多工具在时间有限的编码考试中总是派上用场)。

问题如下:在我的数据集中,“ckm_nodes.csv

可变采用日期记录了采用日期的月份 医生从 1953 年 11 月开始开出四环素。如果医生在第 17 个月(即 1955 年 2 月,即研究结束时)之前没有开始开处方,则记录为 Inf。如果不知道医生何时或是否采用四环素,则其值为 NA。回答以下问题。 (a) 研究的每个月有多少医生开始开四环素? (b) 有多少人在研究期间从未开过药? (c) NA 有多少?


我试图使用 aggregate( ) 函数来计算每个月开始开处方的医生人数。我的基本代码是:

aggregate(nodes$adoption_date, by = nodes["adoption_date"], length), 

这适用于 NA 值。

我想知道是否有一种方法可以让聚合函数计算 NA 值,因此我阅读了有关聚合()函数的 R 文档,其中内容如下:

na.action

一个函数,它指示当数据包含 NA 值时应该发生什么。默认是忽略给定变量中的缺失值。

所以我搜索了如何解决这个问题并设置“na.action = NULL”。但是,当我尝试运行此代码时,发生了以下情况:

aggregate(nodes$adoption_date, by = nodes["adoption_date"], length, na.action = NULL)

FUN(X[[i]], ...) 中的错误: 2 个参数传递给 'length' 需要 1

试图按顺序移动参数:

aggregate(nodes$adoption_date, length, by = nodes["adoption_date"], na.action = NULL)

FUN(X[[i]], ...) 中的错误: 2 个参数传递给 'length' 需要 1

但它也不起作用。

知道如何解决这个问题吗?

********************** tapply()

另外,我想知道是否可以使用“tapply”功能来解决家庭作业上的 Q1。我试过了

count <- function(data){
 return(length(data$adoption_date))
 }

count_tetra <- tapply(nodes,nodes$adoption_date,count)

tapply 中的错误(节点,节点 $adoption_date,计数):参数必须 长度相同

**************循环

我也想知道如何使用循环来实现相同的目标。

我可以从对向量进行排序开始:

nodes_sorted <- nodes[order(nodes$adoption_date),]

然后,编写一个 for 循环,但是如何...?

目标是得到一个向量计数,计数的每个元素对应一个处方数的值。

谢谢!


示例数据:


节点

【问题讨论】:

  • 您好,欢迎来到 SO。您已经提供了很好的详细信息,但您需要将代码格式化为 sn-ps。

标签: r loops aggregate tapply


【解决方案1】:

你看过data.table吗?我相信这样的事情可以解决问题。

require(data.table)
# convert nodes to data.table
setDT(nodes)
# count occurrences for each value of adoption_rate
nodes[, .N, by = adoption_date]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多