首页 文章

如何使用aggregate()来计算NA值并使用tapply()作为替代

提问于
浏览
2

我是R的新手并且正在为R考试做准备,这将在一周内完成 .

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

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

变量采用日期记录了医生开始处方四环素的月份,从1953年11月开始计算 . 如果医生没有在第17个月开始处方,即1955年2月,当研究结束时,这被记录为Inf . 如果不知道医生何时或是否采用四环素,他们的 Value 是NA . 回答以下问题 . (a)有多少医生在研究的每个月开始开处方四环素? (b)在研究期间有多少人没有开处方? (c)有多少个NAs?


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

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

这适用于NA值 .

我想知道是否有一种方法可以让聚合函数计算NA值,所以我读了关于aggregate()函数的R文档,其中说明如下:

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

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

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

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

试图按顺序移动参数:

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

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

但它也不起作用 .

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

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

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

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

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

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

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

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

我可以从矢量排序开始:

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

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

目标是获得向量计数,并且每个计数元素对应于处方数量的值 .

谢谢!


示例数据:


节点< - data.frame(adoption_date = rep(c(1:17,NA,Inf),times = c(rep(5,17),20,3)))

1 回答

  • 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]
    

相关问题