“较长的对象长度不是较短的对象长度的倍数”

时间:2019-03-19 05:08:29

标签: r dplyr

我有这个数据集-

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吗?

3 个答案:

答案 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