2015-10-17 5 views
0

У меня есть данные формата:преобразовательные наблюдения в переменные

|id|genre1|genre2 |genre3 | 
|1 |action|comedy |romance| 
|2 |comedy|romance|  | 
|3 |romance|  |  | 

Я хочу, чтобы преобразовать мои данные, чтобы быть в формате:

|id|action|comedy|romance| 
|1 |1  |1  |1  | 
|2 |0  |1  |1  | 
|3 |0  |0  |1  | 

Что такое лучший способ сделать это?

ответ

1

Вы можете использовать переформирование.

library(dplyr) 
library(tidyr) 

df %>% 
    gather(number, genre, genre1:genre3) %>% 
    filter(genre != "") %>% 
    select(-number) %>% 
    mutate(one = 1) %>% 
    spread(genre, one, fill = 0) 
1

С базой R, вы можете использовать reshape и table:

mydf <-data.frame(id=1:3, 
genre1=c("action","comedy","romance"), 
genre2=c("comedy","romance",NA), 
genre3=c("romance",NA,NA)) 

colnames(mydf)[2:4] <- paste0("genre.",colnames(mydf)[2:4]) 
m_data <- reshape(mydf,direction="long", varying=2:4) 
with(m_data, table(id, genre)) 

    genre 
id action comedy romance 
    1  1  1  1 
    2  0  1  1 
    3  0  0  1 
2

Предполагая, что пустые элементы пустые строки символов (т.е. они не содержат пробелов), вы можете сначала заменить эти элементы с NA и затем используйте пакет reshape2, чтобы изменить данные.

is.na(df) <- df == "" 

library(reshape2) 
dcast(melt(df, 1, na.rm = TRUE), id ~ value, length) 
# id action comedy romance 
# 1 1  1  1  1 
# 2 2  0  1  1 
# 3 3  0  0  1 

Или один вкладыш для удовольствия, оставляя исходные данные без изменений.

dcast(melt(replace(df, df == "", NA), 1, na.rm = TRUE), id ~ value, length) 
# id action comedy romance 
# 1 1  1  1  1 
# 2 2  0  1  1 
# 3 3  0  0  1 

Оригинальные данных:

df <- structure(list(id = 1:3, genre1 = c("action", "comedy", "romance" 
), genre2 = c("comedy", "romance", ""), genre3 = c("romance", 
"", "")), .Names = c("id", "genre1", "genre2", "genre3"), class = "data.frame", row.names = c(NA, 
-3L)) 
Смежные вопросы