Dưới đây là một vài phương pháp:
movies <- data.frame(genre_list = I(list(
c("drama", "action", "romance"),
c("crime", "drama"),
c("crime", "drama", "mystery"),
c("thriller", "indie"),
c("thriller"),
c("drama", "family"))))
Update, năm sau ....
Bạn có thể sử dụng chức năng mtabulate
từ "qdapTools" hoặc unexported charMat
chức năng từ của tôi " gói "splitstackshape".
Cú pháp sẽ là:
library(qdapTools)
mtabulate(movies$genre_list)
# action crime drama family indie mystery romance thriller
# 1 1 0 1 0 0 0 1 0
# 2 0 1 1 0 0 0 0 0
# 3 0 1 1 0 0 1 0 0
# 4 0 0 0 0 1 0 0 1
# 5 0 0 0 0 0 0 0 1
# 6 0 0 1 1 0 0 0 0
hoặc
splitstackshape:::charMat(movies$genre_list, fill = 0)
# action crime drama family indie mystery romance thriller
# [1,] 1 0 1 0 0 0 1 0
# [2,] 0 1 1 0 0 0 0 0
# [3,] 0 1 1 0 0 1 0 0
# [4,] 0 0 0 0 1 0 0 1
# [5,] 0 0 0 0 0 0 0 1
# [6,] 0 0 1 1 0 0 0 0
Cập nhật: Một vài phương pháp tiếp cận trực tiếp hơn
Cải thiện lựa chọn 1: Sử dụng table
hơi trực tiếp:
table(rep(1:nrow(movies), sapply(movies$genre_list, length)),
unlist(movies$genre_list, use.names=FALSE))
Tùy chọn được cải tiến 2: Sử dụng vòng lặp for
.
x <- unique(unlist(movies$genre_list, use.names=FALSE))
m <- matrix(0, ncol = length(x), nrow = nrow(movies), dimnames = list(NULL, x))
for (i in 1:nrow(m)) {
m[i, movies$genre_list[[i]]] <- 1
}
m
Dưới đây là câu trả lời OLD
Chuyển đổi danh sách để một danh sách các table
s (lần lượt chuyển đổi sang data.frame
s):
tables <- lapply(seq_along(movies$genre_list), function(x) {
temp <- as.data.frame.table(table(movies$genre_list[[x]]))
names(temp) <- c("Genre", paste("Record", x, sep = "_"))
temp
})
Sử dụng Reduce
đến merge
danh sách kết quả. Nếu tôi hiểu mục tiêu cuối cùng của bạn một cách chính xác, kết quả này theo hình thức hoán của kết quả mà bạn đang quan tâm.
merged_tables <- Reduce(function(x, y) merge(x, y, all = TRUE), tables)
merged_tables
# Genre Record_1 Record_2 Record_3 Record_4 Record_5 Record_6
# 1 action 1 NA NA NA NA NA
# 2 drama 1 1 1 NA NA 1
# 3 romance 1 NA NA NA NA NA
# 4 crime NA 1 1 NA NA NA
# 5 mystery NA NA 1 NA NA NA
# 6 indie NA NA NA 1 NA NA
# 7 thriller NA NA NA 1 1 NA
# 8 family NA NA NA NA NA 1
transposing và chuyển đổi NA
-0
là khá đơn giản.Chỉ cần thả cột đầu tiên và tái sử dụng nó như cột names
cho cái mới data.frame
movie_genres <- setNames(data.frame(t(merged_tables[-1])), merged_tables[[1]])
movie_genres[is.na(movie_genres)] <- 0
movie_genres
Mỗi mục trong danh sách luôn có thể loại duy nhất không? Nói cách khác, một kỷ lục có thể là "kịch, hành động, lãng mạn, hành động"? – A5C1D2H2I1M1N2O1R2T1