#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