Это продолжение вопроса:R: сравнить значение строки для значений группы, с условием
R data table: compare row value to group values
У меня сейчас:
x = data.table(id=c(1,1,1,1,1,1,1,1), price = c(10, 10, 12, 12, 12, 15,
8, 11), subgroup = c(1, 1, 1, 1, 1, 1, 2, 2))
id price subgroup
1: 1 10 1
2: 1 10 1
3: 1 12 1
4: 1 12 1
5: 1 12 1
6: 1 15 1
7: 1 8 2
8: 1 11 2
и хотел бы вычислить количество строк с более низкими ценами на идентификатор, но только считая их в подгруппе 1.
Если я использую:
x[,cheaper := rank(price, ties.method="min")-1, by=id]
результаты как:
> x
id price subgroup cheaper
1: 1 10 1 1 # only 1 is cheaper (row 7)
2: 1 10 1 1 # only 1 is cheaper (row 7)
3: 1 12 1 4 # 4 frows are cheaper (row 1,2,7,8)
4: 1 12 1 4 # etc
5: 1 12 1 4
6: 1 15 1 7
7: 1 8 2 0
8: 1 11 2 3
, но я хотел бы результат быть:
> x
id price subgroup cheaper_in_subgroup_1
1: 1 10 1 0 # nobody in subgroup 1 is cheaper
2: 1 10 1 0 # nobody in subgroup 1 is cheaper
3: 1 12 1 2 # only row 1 and 2 are cheaper in subgroup 1
4: 1 12 1 2
5: 1 12 1 2
6: 1 15 1 5
7: 1 8 2 0 # nobody in subgroup 1 is cheaper
8: 1 11 2 2 # only row 1 and 2 are cheaper in subgroup 1
Я думаю, что ваша последняя строка неверна, поскольку вы должны сравнивать каждую подгруппу, нет? Я думал что-то вроде 'x [, дешевле: = sapply (цена, функция (x) sum (цена
@DavidArenburg Нет. Я не хочу сравнивать в подгруппах. Я хочу сравнить все строки с подгруппой 1. Я знаю, что это не обычный способ, но это то, что мне нужно. – tucson
Хорошо, это работает 'x [, дешевле: = sapply (цена, функция (x) сумма (цена [подгруппа == 1]