R - добавить значения (полученные по формуле) в столбец фрейма данных на основе условия, которому соответствуют значения в столбце другого фрейма данных

Вот пример набора данных:

data = data.frame('Cat' = c('A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'C'),
                  'Value' = c(1,1,1,2,2,3,3,3,3,3))
data

Другой фрейм данных:

a = data.frame('Name' = c('A', 'B', 'C', 'D'))

Желаемый результат:

Я хочу понять, как указать ссылку на другую ячейку в той же строке фрейма данных и выполнить некоторую функцию, используя значение этой ячейки.

Это сработало для "In Data":

a[,'In Data?'] = ifelse(a$Name %in% unique(data$Cat), "Y", "N")

Это не удалось для медианы:

b$Median = median(data$Cat[data$Cat == a$Name])

Error message:
Error in Ops.factor(data$Cat, a$Name) : 
  level sets of factors are different

Это не удалось для подсчета:

a$Count = ifelse(a$Name %in% unique(data$Cat), length(data$Cat==a$Name), 0)

Error:
Error in Ops.factor(data$Cat, a$Name) : 
  level sets of factors are different

.. 2-й столбец Dataframe:

  1. Кошка: A B C D
  2. количество:
  3. пропорция:
  4. медиана:
  5. значения> медиана:
  6. f (x): {count + 10}
  7. В данных?:

1 ответ

Решение

Эти операции лучше представить как слияние и резюмирование. (Разговор в терминах ячеек и строк кажется скорее похожим на Excel, чем на R). Вdplyr пакет здесь очень помогает

library(dplyr)
a %>% 
  left_join(data, by=c("Name"="Cat")) %>% 
  group_by(Name) %>% 
  summarize(
    Count=sum(!is.na(Value)),
    Median=median(Value),
    ValuesGtMed=sum(Value>Median),
    f = Count+10,
    InData = if_else(Count>0, "Y","N")
  ) %>% 
  mutate(Proportion=Count/sum(Count))

В left_join гарантирует, что мы получим все значения в a а затем мы просто используем разные итоговые функции для групп, определенных Name

Выход:

  Name  Count Median ValuesGtMed     f InData Proportion
  <chr> <int>  <dbl>       <int> <dbl> <chr>       <dbl>
1 A         3      1           0    13 Y             0.3
2 B         2      2           0    12 Y             0.2
3 C         5      3           0    15 Y             0.5
4 D         0     NA          NA    10 N             0  
Другие вопросы по тегам