“较长的物体长度不是较短物体长度的倍数”

问题描述 投票:2回答:3

我有这个数据集 -

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

r dplyr
3个回答
1
投票

从我的评论:dplyr函数作为一个向量作用于整个列。尝试

df %>%
rowwise() %>% 
mutate(reference = length(df2[df2$object == object,]$object))%>%
ungroup()

如你所说,除非你打算进行进一步的逐行操作,否则将需要ungroup


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 

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
© www.soinside.com 2019 - 2024. All rights reserved.