【问题标题】:How can I find the number of a vector's elements in another vector?如何在另一个向量中找到向量元素的数量?
【发布时间】:2017-10-20 00:14:58
【问题描述】:

我有两个向量。第一个向量名称是comments$author_id,第二个是enrolments$learner_id。我想将新列添加到 enrolmens 数据框中,以显示 comments$author_id 向量中每个 enrolment$learner_id 行的重复行数。

例子:

 if(enrolments$learner_id[1] repeated 5 times in comments$author_id)
    enrolments$freqs[1] = 5

我可以不使用任何循环来做到这一点吗?

向量样本如下:

df1 <- data.frame(v1 = c(1,1,1,4,5,5,4,1,2,3,5,6,2,1,5,2,3,4,1,6,4,2,3,5,1,2,5,4))
df2 <- data.frame(v2 = c(1,2,3,4,5,6))

我想将“计数”列添加到“df2”中,以显示 v1 中重复 v2 元素的计数。

【问题讨论】:

  • 在您的问题中包含minimal reproducible example 会增加您获得答案的机会。
  • 使用dput 函数粘贴您所指的数据框或其中的一部分。
  • @jsb 我尝试添加最小的可重现示例。希望如你所说。
  • @JonahThunderbolt - 我已经稍微编辑了它,所以它可以生成有效的 data.frames。我希望这没问题。
  • @thelatemail thanx bro gj :)。我是新手用户。

标签: r vector


【解决方案1】:

"[tabulate] 给我这个错误: $tmp, "cmets_count", value = c(0L, 0L, : 替换有 25596 行,数据 有 25597"

这是因为df2$v2 末尾有一个值,它不属于df1$v1 - 我在您的示例中添加07 以表明:

df1 <- data.frame(v1 = c(1,1,1,4,5,5,4,1,2,3,5,6,2,1,5,2,3,4,1,6,4,2,3,5,1,2,5,4))
df2 <- data.frame(v2 = c(1,2,3,0,4,5,6,7))
df2$count <- tabulate(factor(df1$v1, df2$v2))
# Error in `$<-.data.frame`(`*tmp*`, count, value = c(7L, 5L, 3L, 0L, 5L,  : 
#   replacement has 7 rows, data has 8

使用tabulate 更正此问题,这可能是处理大数据的最快解决方案:

df2$count <- tabulate(factor(df1$v1, df2$v2), length(df2$v2))
df2
# v2 count
# 1  1     7
# 2  2     5
# 3  3     3
# 4  0     0
# 5  4     5
# 6  5     6
# 7  6     2
# 8  7     0

有关该功能的文档,请参阅?tabulate

【讨论】:

  • @lukeaA final$cmets_count2 = tabulate(factor(cmets$author_id, final$learner_id), length(final$learner_id))我试过了,它首先起作用,但现在不起作用。怎么了?它添加了仅指示 0 的新列。
  • @JonahThunderbolt 请提供可重现的示例。
【解决方案2】:

使用您的 df1df2 示例,您可以这样做:

# Make data
df1 = data.frame(v1 = c(1,1,1,4,5,5,4,1,2,3,5,6,2,1,5,2,3,4,1,6,4,2,3,5,1,2,5,4))
df2 = data.frame(v2 = c(1,2,3,4,5,6))

# Add 'count' variable as reqeuested
df2$counts = sapply(df2$v2, function(x) {
  sum(df1$v1 == x, na.rm = T) #na.rm=T just in case df1$v1 has missing values
})
df2 #view output

【讨论】:

  • 可能会奏效,但需要很长时间。我等了 5 分钟,但还没有完成
【解决方案3】:

您实际上所做的是聚合df1 以获取计数,然后将此计数添加回df2 集合。这个逻辑可以很容易地转换成一堆不同的方法:

# base R
merge(
  df2,
  aggregate(cbind(df1[0], count=1), df1["v1"], FUN=sum),
  by.x="v2", by.y="v1", all.x=TRUE
)

# data.table
library(data.table)
setDT(df1)
setDT(df2)
df2[df1[, .(count=.N), by=v1], on=c("v2"="v1")]

# dplyr
library(dplyr)
df1 %>%
  group_by(v1) %>%
  count() %>%
  left_join(df2, ., by=c("v2"="v1"))

#  v2 count
#1  1     7
#2  2     5
#3  3     3
#4  4     5
#5  5     6
#6  6     2

【讨论】:

  • 最后一个代码给了我这个错误,它对我来说太复杂了:D:Warning message: In left_join_impl(x, y, by$x, by$y, suffix$x, suffix$y) : joining factors with different levels, coercing to character vector。我开始学习 R 一周自我。
  • @JonahThunderbolt - 这是一个警告,而不是错误。这只是意味着您在其中一个 data.frames 中有类别,而另一个类别中不存在。连接应该仍然可以正常工作。
  • 它不会对数据框进行任何更改:S。我的待办事项清单很长,我现在哭了
  • @JonahThunderbolt - 你需要覆盖之前的数据集 - df2 &lt;- &lt;insert code here&gt;
  • 是的,它有效。非常感谢兄弟。但是我尝试了相同的代码来计算每个学习者的喜好。 final = final[comments[, .(total_likes=.N), by=likes], on=c("learner_id"="author_id")]我应该如何编辑这段代码?我想了解有关此语法的更多信息。
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2019-09-05
相关资源
最近更新 更多