2013-06-25 2 views
0

Если у меня есть следующий data.frame, который имеет 2 колонки (код и значение)Фильтр «начинается с» в R

Code Value 
A111 5 
B111 10 
C111 15 
A222 20 
B222 25 
C222 30 

И у меня есть следующие группы:

Группа 1 = Все коды, которые начинаются с A

группы 2 = Все коды, которые начинаются с B и C

Я хотел бы, чтобы вычислить

  • Сумма «Value» для группы 1
  • сумма «Value» для 2-й группы
  • Вектор с весами каждого «Value» по отношению к общему количеству «Значение» группы он принадлежит, то есть, для A111 будет 0,2 (5 деленное на общую стоимость для 1-й группы, которая 25)
+2

Все коды начинаются с буквы A, B или C? –

ответ

2

Получить данные:

test <- data.frame(Code = c("A111", "B111", "C111", "D111", "E111", "A222", "B222", "C222", "D222", "E222"), 
Value = c(5L, 10L, 15L, 20L, 25L, 30L, 35L, 45L, 55L, 60L),stringsAsFactors=FALSE) 

сделать группировку переменной для кодов с использованием первой буквы (fl):

fl <- substr(test$Code,1,1) 
groups <- ifelse(fl %in% c("A","B"), 1, 
      ifelse(fl %in% c("C","D"), 2, 
      3)) 

Вычислить вес, используя ave для расчета sum внутри каждой группы.

test$Weight <- test$Value/ave(test$Value,groups,FUN=sum) 
test 

    Code Value Weight 
1 A111  5 0.0625000 
2 B111 10 0.1250000 
3 C111 15 0.1111111 
4 D111 20 0.1481481 
5 E111 25 0.2941176 
6 A222 30 0.3750000 
7 B222 35 0.4375000 
8 C222 45 0.3333333 
9 D222 55 0.4074074 
10 E222 60 0.7058824 
+0

Большое спасибо !!!, это именно то, что мне нужно, но на самом деле мне нужно воспроизвести это для 7 групп в моем реальном примере. Как было бы, если бы я добавил третью группу, скажем, следующий пример: test <- data.frame (Код = c ("A111", "B111", "C111", "D111", "E111 »,« A222 »,« B222 », « C222 »,« D222 »,« E222 »), Value = c (5L, 10L, 15L, 20L, 25L, 30L, 35L, 45L, 55L, 60L), strAsAsFactors = FALSE) # Группа 1 = Все коды, начинающиеся с A # Группа 2 = Все коды, начинающиеся с B и C # Группа 3 = Все коды, начинающиеся с D и E – rwn1v

+0

Вам нужно будет сделать более подробную информацию группируя переменную, используя что-то вроде 'ifelse' - я обновил ответ. – thelatemail