2016-10-30 2 views
0

У меня есть два набора данных:Р: как подсчитать число значений строки имеет в другом кадре обработки данных (длина варьируется)

один фиктивный набор данных, указывающий на наличие определенных признаков:

id a b c .... x y z 
1 1 0 0 .... 1 1 1 
2 0 1 1 .... 0 0 0 
    ... 

и другой набор данных B является именем функции в различных продуктах, которая имеет следующий формат:

prod1 a g b z 
    prod2 b d r h t j 
    ... 
    prod56 f e h 

, что я хочу знать, это число признаков, что каждый идентификатор имеет каждый DIVI продукта определяемый количеством общей характеристики продукта. (Обратите внимание, что каждый идентификатор может иметь функции для нескольких продуктов, и количество функций в каждом продукте меняется).

, например, хочу выходную матрицу с каждым идентификатором в ряд, и каждый продукт в колонке и подсчет коэффициента в каждой ячейке:

output: 
    id prodA prod B .... prod56 
    1 2/26 1/26 .... ... 
    2 1/26 1/26 .... ... 
    ... 

Я знаю, что можно достичь этого с помощью петель, но я интересно, есть ли более чистый и быстрый способ сделать это, используя пакеты обработки данных, такие как dplyr, но я не очень хорошо знаком с этими пакетами, поэтому я был бы очень признателен за понимание.

данных (что-то вроде следующего, но acutual длина характеристики продукта могут меняться - здесь все они содержат 4 функции, представленные 4 букв):

id = seq(1:10) 
data = rbinom(260, 1, 0.5) 
dat_mat = matrix(nrow = 10, ncol = 26, data) 
colnames(dat_mat) = letters[seq(from = 1, to = 26)] 
library("random") 
set.seed(1234) 
product = randomStrings(n=56, len=4, upperalpha=F,digits = F, 
      loweralpha=TRUE, unique=TRUE, check=TRUE) 
+2

Являются ли эти наборы данных в R (пожалуйста, поделитесь) или в файле? –

+0

Как отметил Отт, не могли бы вы предоставить два набора данных в воспроизводимом формате? Вы можете попробовать форматировать два набора данных как матрицу 0/1 (возможно, редкую) из функций (i) id * и (ii) продуктов * и взять их '? Tcrossprod' –

ответ

0

Может быть что-то с pmatch?

set.seed(1) 
d1 <- matrix(rbinom(4*26, 1, 0.5), 4, 26) 
# just random data 
colnames(d1) <- letters 
d2 <- c(prod1="agbz", prod2="bdrhtj", prod3="feh", prod4="xys") 
# just random data 
p1s <- apply(d1, 1, function(x) letters[which(as.logical(x))]) 
p2s <- strsplit(d2, "") 
res <- matrix("", length(p1s), length(p2s)) 
for(i in seq(along=p1s)) { 
    s1 <- p1s[[i]] 
    for(j in seq(along=p2s)) { 
     s2 <- p2s[[j]] 
     res[i, j] <- sum(!is.na(pmatch(s1, s2))) 
    } 
} 
res 

дает

 [,1] [,2] [,3] [,4] 
[1,] "1" "4" "3" "1" 
[2,] "1" "2" "1" "1" 
[3,] "2" "4" "1" "2" 
[4,] "3" "4" "2" "3" 

Примечание: в этом подходе нет никакого способа вокруг двойной петли для создания выходной таблицы, как оба набора данных преобразуются в списки векторов символов.

Я не думаю, что dplyr предлагает много здесь.

Смежные вопросы