Матрица заболеваемости для поиска конкретной информации в кадре данных - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь построить матрицу инцидентности в r, которая позволит мне проверять наличие информации в выбранной строке кадра данных.

Если мои данные выглядят так:

    A   B   C
01  Cat Hat Car
02  Cat Coat Bike
03  Dog Hat Motorcycle
04  Dog Coat Car

Я хотел бы создать таблицу, используя целевую строку (строка A в этом примере), чтобы сгенерировать такую ​​таблицу:

    Cat Hat Car
02  1   0   0
03  0   1   0
04  0   0   1

Кто-нибудь может помочь? Спасибо

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Используйте строку 1 в качестве заголовка для данных и [ifelse], чтобы найти текст и заменить его цифрами.

# Create object for dataframe.
cat <- c("Cat", "Dog", "Dog")
hat <- c("Coat", "Hat", "Coat")
car <- c("Bike", "Motorcycle", "Car")
# Create dataframe.
df1 <- data.frame(cat, hat, car)

# Create df2 to add the digit replacements,
# keeping df1 for later comparison.
df2 <- df1

# Use [ifelse] to find text and replace with numerics.
df2$cat <- ifelse(df1$cat == "Cat",1 ,0 )
df2$hat <- ifelse(df1$hat == "Hat",1 ,0 )
df2$car <- ifelse(df1$car == "Car",1 ,0 )
0 голосов
/ 04 января 2019

Решение, предоставляемое @Sotos, намного более элегантно, но вы также можете сделать что-то подобное с tidyverse:

df[-1, ] %>%
 rename_at(1:3, funs(paste0(as.character(df[1,])))) %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 mutate(val = ifelse(val == var, 1, 0)) %>%
 spread(var, val) %>%
 select(-rowid)

  Car Cat Hat
1   0   1   0
2   0   0   1
3   1   0   0

Или:

df %>% 
 setNames(as.character(df[1,])) %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 mutate(val = ifelse(val == var, 1, 0)) %>%
 spread(var, val) %>%
 filter(rowid != 1) %>%
 select(-rowid)

  Car Cat Hat
1   0   1   0
2   0   0   1
3   1   0   0

Сначала он устанавливает имена столбцов со значениями из первой строки. Во-вторых, он преобразует данные из широких в длинные. Наконец, он сравнивает, совпадает ли значение с именем столбца, и затем применяет данное условие.

0 голосов
/ 04 января 2019

Хитрость заключается в том, чтобы извлечь первую строку как вектор, а не как фрейм данных. Простое сравнение сделает всю работу, т. Е.

df[-1,] == as.character(as.vector(df[1,]))
#       A     B     C
#02  TRUE FALSE FALSE
#03 FALSE  TRUE FALSE
#04 FALSE FALSE  TRUE

Преобразовать в 0/1, просто умножив на 1 (немного кода гольф)

(df[-1,] == as.character(as.vector(df[1,])))*1
#   A B C
#02 1 0 0
#03 0 1 0
#04 0 0 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...