【问题标题】:How to get counter incremented in apply loop如何在应用循环中增加计数器
【发布时间】:2018-04-22 21:12:32
【问题描述】:

我正在尝试对数据帧的每一行进行计数器计数,其中第 1 列需要等于“vsrv11”,第 3 列必须是需要 2017 年的日期。 所以我做了这段代码,计数器在 if 语句中递增,但是对于循环的每次迭代,计数器再次变为 0。

count <- 0

funcao.teste <- function (x) {
    if (x[1] == "vsrv11" && substring(x[3],0,4) == "2017") {
        count <<- count + 1
    }
}

apply(vpnsessions, 1, funcao.teste, count)

【问题讨论】:

  • 基本答案是不要那样做。多种不良、严重低效的做法。

标签: r apply


【解决方案1】:

一般来说,我建议不要使用全局变量,而且,您可以通过简单的过滤来检查这一点。

df <- data.frame(x = sample(c("vsrv11", rnorm(10)), 100, replace = TRUE),
                 y = rnorm(100),
                 z = as.character(sample(c(2017, 2018), 100, replace = TRUE)))


nrow(df[df[, 1] == "vsrv11" & grepl("2017", df[, 3]), ])

或者只是

sum(df[, 1] == "vsrv11" & grepl("2017", df[, 3]))

【讨论】:

  • 第二个是更好的做法。第一个构造一个包含原始所有列的数据框,而第二个只是构建两个逻辑向量。
【解决方案2】:

tidyverse 中,您可以使用dplyr::count 执行这样的操作:

# Sample data
vpnsessions <- data.frame(
    srv = "vsrv11",
    id = c(rep("2017_abc", 10), rep("2018_def", 8)),
    stringsAsFactors = F)

library(dplyr);
count(vpnsessions, year = substr(id, 1, 4))
## A tibble: 2 x 2
#  year      n
#  <chr> <int>
#1 2017     10
#2 2018      8

注意count 如何计算ids 的出现次数。从生成的data.frame/tibble 中提取相关行很容易。

为了挑剔,在 R 中,索引以 1 而不是 0 开头,因此代码中的 substring(..., 0, 4) 应该是 substring(..., 1, 4)

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2017-05-26
    • 2017-06-19
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多