我有一个数据集“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,但情况并非如此。任何人都可以建议问题出在哪里或如何解决这个问题?
答案 0 :(得分:2)
我们实际上可以这样做的方式起初看起来有点奇怪,但相对简单。让我们从仅使用数据框a
和b
开始,让我们稍微简化一下。我们假设id
和a
中的b
变量如下:
a_id <- 1:5
b_id <- 1:5
在这个简单的示例中,a_id
和b_id
完全相同。我们想知道的是a_id
中b_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_id
中diag
的每个值出现多少次的计数,而且每个值都是我们已经知道的。那么我们如何获得这些信息呢? 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_id
为a_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}}
就像我说的那样,起初看起来有点奇怪,但它相对直接。希望这对你有所帮助,而不是让你困惑。