我有这个数据集-
print(df)
object group
1 apple A
1 banana B
1 pear A
1 robot C
print(df2)
object group
1 apple A
1 apple B
1 apple A
1 robot C
1 robot C
1 robot C
1 banana C
我想计算每个值在另一个数据集中出现的次数,该数据集看起来完全一样,但是从不同的时间段提取数据。另一个数据集称为df2
。
我使用了此代码-
x <- df %>%
mutate(reference = length(df2[df2$object == object,]$object))
它给了我这个错误:longer object length is not a multiple of shorter object length
。
当我在dplyr之外运行它时,它会起作用-
object <- "apple"
length(df2[df2$object == object,]$object)
我可以做一个相对的引用,包括过滤器中的object
吗?
答案 0 :(得分:2)
如果您需要tidyverse
选项,我们可以使用map_dbl
purrr::map_dbl(df$object, ~ length(df2[df2$object == .,]$object))
#[1] 3 1 0 3
也可以使用sum
purrr::map_dbl(df$object, ~ sum(df2$object == .))
因此,我们可以在mutate
中添加
df %>%
mutate(reference = map_dbl(object, ~ sum(df2$object == .)))
# object group reference
#1 apple A 3
#2 banana B 1
#3 pear A 0
#4 robot C 3
类似的基本R选项是sapply
sapply(df$object, function(x) sum(df2$object == x))
# apple banana pear robot
# 3 1 0 3
答案 1 :(得分:1)
根据我的评论:dplyr函数在作为矢量的整个列上工作。尝试
df %>%
rowwise() %>%
mutate(reference = length(df2[df2$object == object,]$object))%>%
ungroup()
如您所说,除非您计划进行进一步的按行操作,否则将需要ungroup
。
答案 2 :(得分:0)
我们可以在data.table
library(data.table)
reference <- setDT(df2)[df, .N, on = .(object), by = .EACHI]$N
df$reference <- reference
df
# object group reference
#1: apple A 3
#2: banana B 1
#3: pear A 0
#4: robot C 3