Я пытаюсь проверить каждую строку в моей таблице data.table, если есть определенные элементы (которые я объявляю как 1, если есть). Если есть, я хотел бы вывести новый столбец, который показывает значение (вероятность того, что элемент происходит), ссылающийся на другую таблицу данных.Как использовать apply вместо for-loop для проверки каждого столбца в каждой строке
Это является входным
structure(list(A = c(0L, 0L, 0L, 0L, 0L), B = c(0L, 0L, 0L, 0L,
0L), C = c(1L, 0L, 1L, 1L, 1L), D = c(0L, 1L, 0L, 0L, 1L)), .Names = c("A",
"B", "C", "D"), class = "data.frame", row.names = c(NA, -5L))
В таблицах, которые я использовал для ссылки, чтобы получить вероятности
Таблица Pyxixj
A B C D
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0.001804403
D 0 0 0.001804403 0
Таблица Pyxi
A 0
B 0
C 0.00086701
D 0.000250439
Это выход
A B C D prob
1 0 0 1 0 0.00086701
2 0 0 0 1 0.000250439
3 0 0 1 0 0.00086701
4 0 0 1 0 0.00086701
5 0 0 1 1 0.001804403
Я сделал это с помощью для цикла ниже, но это занимает 6hrs, чтобы работать около 1 миллиона строк.
for (i in 1:nrow(cnts2))
{
if ((rowSums(cnts2 == "1", na.rm = TRUE) == 1)[i])
{
cnts2$prob[i] <- Pyxi[colnames(cnts2)[which(cnts2[i, ] == 1)]]
}
else
{
cnts2$prob[i] <- Pyxixj[colnames(cnts2)[which(cnts2[i, ] == 1)][1], colnames(cnts2)[which(cnts2[i, ] == 1)][2]]
}
}
пытался apply
, но я понял его еще.
Не могли бы вы использовать 'dput' на этих подмножествах' 'Pyxixj' и Pyxi' только, чтобы сделать его легче воспроизвести их? –
Данные для тех, кто это хочет 'cnts2 <-matrix (c (0,0,1,0, 0,0,0,1, 0,0,1,0, 0,0,1,0, 0) , 0,1,1), nrow = 5, ncol = 4, byrow = TRUE) colnames (cnts2) <- c ("A", "B", "C", "D") cnts2 <-as .data.frame (cnts2) Pyxixj <-matrix (c (0,0,0,0, 0,0,0,0, 0,0,0,0,001804403, 0,0,0,001804403,0), nlow = 4, ncol = 4, byrow = TRUE) colnames (Pyxixj) <- c («A», «B», «C», «D») rownames (Pyxixj) <- c («A», «B», «C», «D») Pyxi <-matrix (c (0,0,0,00086701,0,000250439), nrow = 4) rownames (Pyxi) <- c ("A", "B" , "C", "D") ' – MorganBall
Вы пытались параллельно работать с ForEach? – MorganBall