Как я могу изменить data.table или data.farme в R, не суммируя частоты?

Я пытаюсь изменить следующую таблицу data.table, чтобы она соответствовала таблице сопряженности (не совсем потому, что я не хочу получать частоту в качестве значения, я просто хочу 0 или 1):

ДФ:

ID          CC
990081899A  CC2
990081899A  CC115
990081899A  CC39
990081899A  CC39
990081899A  CC115
990002362D  CC2
990002362D  CC115
990002362D  CC115
990002362D  CC115
990002362D  CC6
990042716D  CC2

Я попробовал 2 вещи следующим образом, но получил тот же результат:

Первый:

Contingency<-with(Df, table(ID,CC))
Diag6<- cbind(ID = rownames(Contingency), apply(Contingency, 2 , as.character))

Во-вторых:

Я добавил столбец значений в данные, такие как Value = 1: Df:

ID          CC  Value
990081899A  CC2 1
990081899A  CC115   1
990081899A  CC39    1
990081899A  CC39    1
990081899A  CC115   1
990002362D  CC2 1
990002362D  CC115   1
990002362D  CC115   1
990002362D  CC115   1
990002362D  CC6 1
990042716D  CC2 1

и попробовал:

Df<- data.table(dcast(Df,ID~CC,value.var="Value"),key="ID")

Оба результата одинаковы:

ID  CC115   CC2 CC39    CC6
990081899A  2   1   2   0
990002362D  3   1   0   1

Здесь я не хочу частоту, я просто хочу, если она присутствует, значение должно быть равно 1, иначе 0:

ID       CC115  CC2 CC39    CC6
990081899A  1   1   1   0
990002362D  1   1   0   1

Любые предложения высоко ценятся.

3 ответа

Решение

Просто используя table(DF) даст вам ваш макет.
Затем вы можете преобразовать все положительные значения в 1 с помощью sign

     sign(table(DF))

                CC
    ID           CC115 CC2 CC39 CC6
      990002362D     1   1    0   1
      990042716D     0   1    0   0
      990081899A     1   1    1   0

Я уверен, что на это уже отвечали где-то раньше, но table должен быть в состоянии сделать это:

with(unique(dat), table(ID,CC) )

#            CC
#ID           CC115 CC2 CC39 CC6
#  990002362D     1   1    0   1
#  990042716D     0   1    0   0
#  990081899A     1   1    1   0

Вы можете обернуть выше, как:

as.data.frame.matrix(with(unique(dat), table(ID,CC) ))

... если вы предпочитаете этот вывод.

#           CC115 CC2 CC39 CC6
#990002362D     1   1    0   1
#990042716D     0   1    0   0
#990081899A     1   1    1   0

Вы можете сделать это (с или без data.table), передав свою собственную функцию dcast

dcast(DF,  ID~CC, fun = function(x) as.integer(length(x)>0))
# Using CC as value column: use value.var to override.
#           ID CC115 CC2 CC39 CC6
# 1 990002362D     1   1    0   1
# 2 990042716D     0   1    0   0
# 3 990081899A     1   1    1   0

Или передавая уменьшенный data.frame, содержащий уникальные комбинации

 dcast(unique(DF), ID~CC,fun=length,value.var = 'CC')
Другие вопросы по тегам