Как преобразовать фрейм данных в матрицу значений «Да» или «Нет» в R?

#r

#r

Вопрос:

Извините, если заголовок не очень понятен. У меня есть фрейм данных, df:

 df <- structure(list(df = c("cat", "dog", "cat", "fish", 
"dog", "cat")), row.names = c("house1a", "house1b", 
"house2a", "house2b", "house3", "house4"
), class = "data.frame")

> df
          df
house1a  cat
house1b  dog
house2a  cat
house2b fish
house3   dog
house4   cat
 

Я хочу иметь возможность указывать типы животных в качестве имен строк, а затем иметь значение «Да» или «Нет», если они присутствуют в каждом домохозяйстве. Обратите внимание, что на домохозяйство приходится несколько строк, например. house1a и house1b оба являются house1.

Результирующий фрейм данных будет выглядеть следующим образом:

 df_new <- structure(list(
house1 = c("Yes", "Yes", "No"), 
house2 = c("Yes", "No", "Yes"), 
house3 = c("No", "Yes", "No"), 
house4 = c("Yes", "No", "No")), 
row.names = c("cat", "dog", 
"fish"), class = "data.frame")

> df_new
     house1 house2 house3 house4
cat     Yes    Yes     No    Yes
dog     Yes     No    Yes     No
fish     No    Yes     No     No
 

Каков наилучший способ создать это в R?

Комментарии:

1. Попробуйте: table(df$df, substring(rownames(df), 1, 6))

2. Спасибо! Если вы укажете это в качестве ответа, я пометлю его как решаемый

Ответ №1:

Попробуйте:

 table(df$df, substring(rownames(df), 1, 6))
#      house1 house2 house3 house4
# cat       1      1      0      1
# dog       1      0      1      0
# fish      0      1      0      0
 

Ответ №2:

Я бы сделал это

 df$house <- row.names(df)
res <- dplyr::group_by(df, house) 
res <- dplyr::summarise(res, containscat = "cat" %in% df, containsdog = "dog" %in% df)
> res
# A tibble: 6 x 3
house   containscat containsdog
<chr>   <lgl>       <lgl>      
  1 house1a TRUE        FALSE      
2 house1b FALSE       TRUE       
3 house2a TRUE        FALSE      
4 house2b FALSE       FALSE      
5 house3  FALSE       TRUE       
6 house4  TRUE        FALSE 
 

Комментарии:

1. Представьте 100 разных животных. Плюс есть только 4 дома.