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:
- Кошка: A B C D
- количество:
- пропорция:
- медиана:
- значения> медиана:
- f (x): {count + 10}
- В данных?:
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