У меня есть датафрейм, структурированный как:
ID X1 X2 X3 X4 X5
1 1 grn gerp hrn asn bln
2 2 asn bln hgv mpl zwl
3 3 zwl mpl lwd <NA> <NA>
4 4 bln asn hrn gerp grn
5 5 lwd mpl zwl <NA> <NA>
В настоящее время я использую недостаточный метод, чтобы проверить, содержит ли строка слово в следующем списке слов:
wordlist <- c("asn", "bln", "gerp", "grn", "hgv", "hrn", "lwd", "mpl", "zwl")
Используя метод ниже, я получаю значение ИСТИНА или ЛОЖЬ, если идентификатор строки содержит слово в строке:
newDF <- as.data.frame(DF[,1])
newDF[, wordlist] <- NA
newDF[2] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[1])))
newDF[3] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[2])))
newDF[4] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[3])))
newDF[5] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[4])))
newDF[6] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[5])))
newDF[7] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[6])))
newDF[8] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[7])))
newDF[9] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[8])))
newDF[10] <- apply(DF, 1, function(r) any(r %in% as.character(wordlist[9])))
В результате получается следующий фрейм данных:
DF[, 1] asn bln gerp grn hgv hrn lwd mpl zwl
1 1 TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE FALSE
2 2 FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE
3 3 FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
4 4 TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE FALSE
5 5 FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
Как вы видите, этот метод довольно неэффективен, тем более что мне приходится применять этот метод к гораздо большему DF и списку слов из 400 слов.
Основной вопрос: (РЕДАКТИРОВАТЬ: РЕШЕНО)
- Есть ли эффективный способ получить тот же результат?
Подвопрос:
- Можно ли вывести не TRUE или FALSE, а индекс слова, в котором слово находится в строке DF?
Dataframe, чтобы попробовать:
> dput(DF)
structure(list(ID = 1:5, X1 = structure(c(3L, 1L, 5L, 2L, 4L), .Label = c("asn ", "bln", "grn", "lwd", "zwl"), class = "factor"), X2 = structure(c(3L, 2L, 4L, 1L, 4L), .Label = c("asn", "bln", "gerp", "mpl"), class = "factor"), X3 = structure(c(2L, 1L, 3L, 2L, 4L), .Label = c("hgv", "hrn",
"lwd", "zwl"), class = "factor"), X4 = structure(c(1L, 3L,
NA, 2L, NA), .Label = c("asn", "gerp", "mpl"), class = "factor"), X5 = structure(c(1L, 3L, NA, 2L, NA), .Label = c("bln", "grn",
"zwl"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))
Заранее спасибо!