r: pmatch не работает для больших данных
У меня есть два кадра данных, первый (dt
) содержит всего chr
и второй (TargetWord
) словарь содержит chr
также. я использовал pmatch
искать в dt
какие слова доступны в TargetWord
и вернуть позицию из TargetWord
, Работает нормально, когда датафреймы маленькие. Но проблема начинается, когда кадры данных огромны, они возвращают позицию слова только для первого столбца, остальные столбцы становятся NA.
## Data Table
word_1 <- c("conflict","", "resolved", "", "", "")
word_2 <- c("", "one", "tricky", "one", "", "one")
word_3 <- c("thanks","", "", "comments", "par","")
word_4 <- c("thanks","", "", "comments", "par","")
word_5 <- c("", "one", "tricky", "one", "", "one")
dt <- data.frame(word_1, word_2, word_3,word_4, word_5, stringsAsFactors = FALSE)
## Targeted Words
TargetWord <- data.frame(cbind(c("conflict", "thanks", "tricky", "one", "two", "three")))
## convert into matrix (needed)
dt <- as.matrix(dt)
TargetWord <- as.matrix(TargetWord)
result <- `dim<-`(pmatch(dt, TargetWord, duplicates.ok=TRUE), dim(dt))
print(result)
Возвращая результат,
[,1] [,2] [,3] [,4] [,5]
[1,] 1 NA 2 2 NA
[2,] NA 4 NA NA 4
[3,] NA 3 NA NA 3
[4,] NA 4 NA NA 4
[5,] NA NA NA NA NA
[6,] NA 4 NA NA 4
Теперь после прочтения двух .csv
как показано ниже, результат только для первого столбца, где я хочу его для всех столбцов, как указано выше. Сильфон, dt1 = 79*50, и data_dict 13901*1.
#################### on big data #####################################
dt1 <- read.csv("C:/Users/Wonderland/Downloads/string_feature.csv", stringsAsFactors = FALSE)
word_dict <- read.csv("C:/Users/Wonderland/Downloads/word_dict.csv", stringsAsFactors = FALSE)
dt1 <- as.matrix(dt1)
word_dict <- as.matrix(word_dict)
result <- `dim<-`(pmatch(dt1, word_dict, duplicates.ok=TRUE), dim(dt1))
print(result)
2 ответа
Попробуйте с применить:
apply(dt,2,function(x) pmatch(x,TargetWord,duplicates.ok = T))
Как видите, результат тот же, но он, вероятно, работает с огромным фреймом данных
word_1 word_2 word_3 word_4 word_5
[1,] 1 NA 2 2 NA
[2,] NA 4 NA NA 4
[3,] NA 3 NA NA 3
[4,] NA NA NA NA NA
[5,] NA NA NA NA NA
[6,] NA NA NA NA NA
Я пробовал с:
word_1 <- rep(c("conflict","", "resolved", "", "", ""),1000)
word_2 <- rep(c("", "one", "tricky", "one", "", "one"),1000)
word_3 <- rep(c("thanks","", "", "comments", "par",""),1000)
word_4 <- rep(c("thanks","", "", "comments", "par",""),1000)
word_5 <- rep(c("", "one", "tricky", "one", "", "one"),1000)
со всем тем же кодом, и это сработало.
pmatch
в настоящее время работает только для размеров до 100 .
pmatch(rep("a", 100), rep("a", 100))
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
# [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
# [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
# [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
# [91] 91 92 93 94 95 96 97 98 99 100
pmatch(rep("a", 101), rep("a", 101))
# [1] 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
# [26] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
# [51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
# [76] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#[101] NA