2016-04-15 2 views
2

Я пытаюсь изменить данные, но с некоторыми условиями. Данные будут выглядеть следующим образом. например, будет больше ID, который повторяетсяИзменение данных с условиями в R

S.No  Count ID  Type 
    1   135 350  A 
    2   114 350  A 
    3   84 350  A 
    4   80 350  A 
    5   19 350  A 
    6   8 350  A 
    7   21 350  A 
    8   88 350  B 
    9  111 350  B 
    10  46 350  B 
    11  108 350  B 
    12  19  352  A 
    13  117 352  A 
    14  167 352  B 

И мне нужно его преобразовать, как показано ниже.

S.No ID Type Count_type B Count_typeA_less than  Count_typeA 
             max(count_type B)  high than 
                  max(count_type B) 
1  350 B  88,111,46,108  84,80,19,8,21    135,114 
2  352 B  167     19,117      NA 

Count_typeA_Less, чем макс (count_type B) = кол типа А, который меньше, чем максимальное количество count_type B
Count_typeA_high чем макс (count_type B) = кол типа А, которые выше, чем максимальное количество count_type B

Я пробовал с dplyr и изменял форму. Я не мог этого добиться. Пожалуйста, наставит меня на описанной выше ситуации в R.

+0

Неясно, какая структура должна быть вашей продукции? Это кадр данных? И если да, существует ли единое значение «88, 111, 46, 108» или должно быть четыре случая (четыре отдельных значения)? Или достаточно просто иметь дополнительную переменную, которая указывает, для каждой строки, является ли тип count A меньше или больше, чем 'max (count type B)'? (и что, если тип счета A равен счету типа B)? – Daniel

+0

Спасибо, Дэниэл, за ваш ответ. Да, мне нужно, чтобы это был кадр данных. Имеющиеся у меня данные имеют 1000 наблюдений с разными идентификаторами, такими как. Во-вторых, я нуждаюсь в нем как одно значение, где счетчик должен быть разделен запятой. Наконец, если тип счета A равен счету типа B, то отдельный столбец, показывающий, что счетчик равен (опять же это должно быть одно значение) – ssan

+0

ok, поэтому эти столбцы должны быть символьными векторами? Например, первое значение в столбце ** Count_typeA_less than max (count B) ** является '' 88, 111, 46, 108 "'? – Daniel

ответ

1

Ниже, кажется, делает по существу то, что вы просите:

library(data.table) 
setDT(mydf) 

mydf[, list(type_B = toString(Count[Type == "B"]), 
      type_A_lt_mB = toString(Count[Type == "A" & Count < max(Count[Type == "B"])]), 
      type_A_gt_mB = toString(Count[Type == "A" & Count > max(Count[Type == "B"])])), ID] 
##  ID   type_B  type_A_lt_mB type_A_gt_mB 
## 1: 350 88, 111, 46, 108 84, 80, 19, 8, 21  135, 114 
## 2: 352    167   19, 117 

Вот начиная data.frame я использовал:

mydf <- structure(list(Count = c(135L, 114L, 84L, 80L, 19L, 8L, 21L, 
    88L, 111L, 46L, 108L, 19L, 117L, 167L), ID = c(350L, 350L, 350L, 
    350L, 350L, 350L, 350L, 350L, 350L, 350L, 350L, 352L, 352L, 352L 
    ), Type = c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B", 
    "B", "A", "A", "B")), .Names = c("Count", "ID", "Type"), row.names = c(NA, 
    14L), class = "data.frame") 

Я удалил столбец «S.no», потому что он кажется совершенно не относящимся к вопросу.

Смежные вопросы