R 中的 countif 在每一行中重复
countif within R repeated across each row
我在尝试复制我在 excel 中熟悉的一些 countif 函数时遇到了问题。我有一个数据框,它有很多行。我正在尝试获取 2 个变量(x 和 z)并计算我的数据框中有多少其他变量与它匹配。我想到了这样做:
sum('mydataframe'$x==`mydataframe`$x[1]&`mydataframe'$z==`mydataframe`$z[1])
这为我提供了第一行 [1] 的整个数据集中 x&z 的正确计数。问题是我必须使用那个 [1]。我试过使用 (with,...) 命令,但我无法再访问整个列。
我希望能够对数据框中每一行的 x 和 z 组合进行计数,然后将该输出作为一个新向量,我可以将其添加为另一列。我希望每一行都如此,直到最后。
希望这很简单。我认为 (with,..) 或 apply 或某物的某种组合可以做到这一点,但我太新了。
我对每个实例的总计数感兴趣,而不是 运行 顺序计数。
您似乎在寻求一种方法来创建一个新列,其中包含整个数据框中的行数,x
和 z
值等于这些变量的值对于那一行。
有一点示例数据:
(dat <- data.frame(x=c(1, 1, 2), z=c(3, 3, 3)))
# x z
# 1 1 3
# 2 1 3
# 3 2 3
一种简单的方法是使用 dplyr
的 group_by
函数进行分组,然后使用该组中的元素数创建一个新列:
library(dplyr)
dat %>% group_by(x, z) %>% mutate(n=n())
# x z n
# (dbl) (dbl) (int)
# 1 1 3 2
# 2 1 3 2
# 3 2 3 1
基础 R 解决方案可能涉及 ave
:
dat$n <- ave(rep(NA, nrow(dat)), dat$x, dat$z, FUN=length)
dat
# x z n
# 1 1 3 2
# 2 1 3 2
# 3 2 3 1
使用 data.table
的选项是将 'data.frame' 转换为 'data.table' (setDT(dat)
) ,按 'x'、'z' 分组和
分配 'n' 作为每个组中的元素数 (.N
).
library(data.table)
setDT(dat)[, n:= .N, by = .(x,z)]
dat
# x z n
#1: 1 3 2
#2: 1 3 2
#3: 2 3 1
我在尝试复制我在 excel 中熟悉的一些 countif 函数时遇到了问题。我有一个数据框,它有很多行。我正在尝试获取 2 个变量(x 和 z)并计算我的数据框中有多少其他变量与它匹配。我想到了这样做:
sum('mydataframe'$x==`mydataframe`$x[1]&`mydataframe'$z==`mydataframe`$z[1])
这为我提供了第一行 [1] 的整个数据集中 x&z 的正确计数。问题是我必须使用那个 [1]。我试过使用 (with,...) 命令,但我无法再访问整个列。
我希望能够对数据框中每一行的 x 和 z 组合进行计数,然后将该输出作为一个新向量,我可以将其添加为另一列。我希望每一行都如此,直到最后。
希望这很简单。我认为 (with,..) 或 apply 或某物的某种组合可以做到这一点,但我太新了。
我对每个实例的总计数感兴趣,而不是 运行 顺序计数。
您似乎在寻求一种方法来创建一个新列,其中包含整个数据框中的行数,x
和 z
值等于这些变量的值对于那一行。
有一点示例数据:
(dat <- data.frame(x=c(1, 1, 2), z=c(3, 3, 3)))
# x z
# 1 1 3
# 2 1 3
# 3 2 3
一种简单的方法是使用 dplyr
的 group_by
函数进行分组,然后使用该组中的元素数创建一个新列:
library(dplyr)
dat %>% group_by(x, z) %>% mutate(n=n())
# x z n
# (dbl) (dbl) (int)
# 1 1 3 2
# 2 1 3 2
# 3 2 3 1
基础 R 解决方案可能涉及 ave
:
dat$n <- ave(rep(NA, nrow(dat)), dat$x, dat$z, FUN=length)
dat
# x z n
# 1 1 3 2
# 2 1 3 2
# 3 2 3 1
使用 data.table
的选项是将 'data.frame' 转换为 'data.table' (setDT(dat)
) ,按 'x'、'z' 分组和
分配 'n' 作为每个组中的元素数 (.N
).
library(data.table)
setDT(dat)[, n:= .N, by = .(x,z)]
dat
# x z n
#1: 1 3 2
#2: 1 3 2
#3: 2 3 1