«большая длина объекта не кратна короткой длине объекта» - PullRequest
2 голосов
/ 19 марта 2019

У меня есть этот набор данных -

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 ]

2 голосов
/ 19 марта 2019

Если вам нужна опция 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 голос
/ 19 марта 2019

Из моего комментария: функции dplyr работают со всем столбцом, взятым как вектор. Попробуйте

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

Как вы сказали, ungroup потребуется, если вы не планируете выполнять дальнейшие операции со строками.

0 голосов
/ 19 марта 2019

Мы можем сделать это за 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...