R中的Countif函数(excel)

时间:2016-04-28 23:26:17

标签: r apply frequency countif

我有一个数据集“a”,其列“id”包含大约23,000行,在此数据框中是唯一的。我想在另外两个数据集“b”和“c”中计算这些唯一值的出现频率。 为此,我尝试了代码:

count1 <- as.data.frame(apply(a,1,function(x)sum(b$id==x[45])))
a <- cbind(a,count1)

,因为“id”是数据帧“b”中的第45列。 该代码适用于b中的计数,但是当我尝试使用相同的代码来计算数据帧“c”中“id”的频率时:

count2 <- as.data.frame(apply(a,1,function(x)sum(c$id==x[17])))
数据框“c”中的

“id”在第17列中。所有“id”的频率都计为0,但情况并非如此。任何人都可以建议问题出在哪里或如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我们实际上可以这样做的方式起初看起来有点奇怪,但相对简单。让我们从仅使用数据框ab开始,让我们稍微简化一下。我们假设ida中的b变量如下:

a_id <- 1:5
b_id <- 1:5

在这个简单的示例中,a_idb_id完全相同。我们想知道的是a_idb_id中的每个值出现多少次table。我们显然知道每个答案都是一次,但我们如何让R告诉我们呢?那个table(a_id, b_id) # b_id # a_id 1 2 3 4 5 # 1 1 0 0 0 0 # 2 0 1 0 0 0 # 3 0 0 1 0 0 # 4 0 0 0 1 0 # 5 0 0 0 0 1 函数可以派上用场:

b_id

这可能看起来有点难看,但你可以看到我们的a_id位于顶部(1-5),我们的a_id位于左侧。在对角线下方,我们会看到b_iddiag的每个值出现多少次的计数,而且每个值都是我们已经知道的。那么我们如何获得这些信息呢? R有一个很好的函数叫diag(table(a_id, b_id)) # 1 2 3 4 5 # 1 1 1 1 1 ,它为我们提供了主要的对角线:

b_id

我们有它。我们的&#34; countif&#34;值。但是,如果a_id没有table中的所有值,该怎么办?如果我们尝试做我们刚刚做的事情,我们会收到错误,因为a_id <- 1:10 b_id <- 4:8 table(b_id[b_id %in% a_id]) # 4 5 6 7 8 # 1 1 1 1 1 在两个向量具有不同长度时并不喜欢它。所以我们稍微修改一下:

%in%

这里有几件新事物。使用1 %in% 1:3只是要求R告诉我们向量中是否存在值。例如,TRUE将返回4 %in% 1:3,但FALSE将返回b_id。接下来,您会注意到我们使用[b_id编入索引。这仅返回b_id %in% a_id TRUE b_ida_id的值,在本例中为b_id

那么,如果我们期望a_id中每个b_id的值不是多个,而a_id <- 1:10 b_id <- sample(3:7, 1000, replace=TRUE) table(b_id[b_id %in% a_id]) # 3 4 5 6 7 # 210 182 216 177 215 中的{{1}}值不是每个{{1}},那么这会是什么样的?让我们看一个更真实的例子:

{{1}}

就像我说的那样,起初看起来有点奇怪,但它相对直接。希望这对你有所帮助,而不是让你困惑。