Количество вхождений в кадре данных - PullRequest
1 голос
/ 15 апреля 2020

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

df:

gene    a    b    c
abc     1    NA   1
bca     NA   1    1
cba     1    2    1

мой df больше, так что это только пример масштабируемого.

Желаемый фрейм данных таков:

gene    a    b    c    freq
abc     1    NA   1     2
bca     NA   1    1     2
cba     1    2    1     3

коды, которые я пробовал, таковы:

g <- df %>% mutate(numtwos = rowSums(. > 0))

или

df$freq <- apply(df , 1, function(x) length(which(x>0)))

Но это не работает, потому что если в строке должно быть (например) 150 повторений, я получу только 2 для каждой строки.

Любая помощь или другая точка зрения приветствуется!

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Мы можем сначала использовать преобразование Na в «NA»

library(dplyr)
df %>%
   mutate_at(vars(a:c), ~ as.numeric(na_if(., "Na"))) %>%
   mutate(freq = rowSums(select(., a:c), na.rm = TRUE))
#  gene  a  b c freq
#1  abc  1 NA 1    2
#2  bca NA  1 1    2
#3  cba  1  1 1    3

Здесь все значения равны 1 с, так что это то же самое, что получить сумму не-NA

df %>%
   mutate_at(vars(a:c), ~ as.numeric(na_if(., "Na"))) %>%
   mutate(freq = rowSums(!is.na(select(., a:c))))

данные

df <- structure(list(gene = c("abc", "bca", "cba"), a = c("1", "Na", 
"1"), b = c("Na", "1", "1"), c = c(1L, 1L, 1L)), 
class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 15 апреля 2020

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

...