«большая длина объекта не кратна меньшей длине объекта»

#r #dplyr

#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 в фильтр?

Комментарии:

1. dplyr функции работают со всем столбцом, взятым в качестве вектора. Попробуйте df %>% rowwise() %>% mutate... .

2. Я использовал это в качестве решения. Пожалуйста, отнеситесь к этому как к ответу, чтобы я мог его принять.

3. Нужно ли мне что-нибудь сделать, например ungroup() , чтобы вернуть его в нормальное состояние после использования rowwise()

4. @Cauder В идеале вы должны сделать ungroup , потому что выходные данные сгруппированы по строкам, и группировка останется, если вы собираетесь провести дальнейший анализ.

Ответ №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 
  

Ответ №3:

Мы можем сделать это в 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