簡體   English   中英

按R中的列計算值的頻率

[英]Calculating frequency of values by column in R

有誰知道如何用該值在列中出現的頻率替換單元格的值? 我正在嘗試將一個充滿品種標簽和基因因子的數據框轉換為頻率圖(稍后再觀察動物,一個基因的共同等位基因是否也傾向於其他基因的共同等位基因)。 例如,我的初始數據框如下所示:

Breed    Gene A     Gene B    Gene C
Collie      3          5         8
Collie      5          7         2
Lab         3          3         1
Pug         3          7         8
Pug         3          7         9
Pug         4          4         9

我希望結果如下所示:

Breed    Gene A     Gene B    Gene C
2           4          1         2
2           1          3         1
1           4          1         1
3           4          3         1
3           4          3         2
3           1          1         2

我可以看到如何使用 for 循環來做到這一點(創建新的數據框,循環每列,循環每行,將每個值更改為一個計數器,當它遇到相等的值時會增加一個),但是有沒有更簡單的和更有效的應用或 dplyr 方法? 數據集很大,我將經常重新運行,而且我擔心嵌套的 for 循環會太慢。

這是一個基本的 R 選項 -

replace_value_by_count <- function(x) ave(x, x, FUN = length)
df[] <- lapply(df, replace_value_by_count)
df

#  Breed GeneA GeneB GeneC
#1     2     4     1     2
#2     2     1     3     1
#3     1     4     1     1
#4     3     4     3     2
#5     3     4     3     2
#6     3     1     1     2

由於您已標記dplyr ,因此也可以使用dplyr使用相同的功能。

library(dplyr)
df <- df %>% mutate(across(.fns = replace_value_by_count))

數據

df <- structure(list(Breed = c("Collie", "Collie", "Lab", "Pug", "Pug", 
"Pug"), GeneA = c(3L, 5L, 3L, 3L, 3L, 4L), GeneB = c(5L, 7L, 
3L, 7L, 7L, 4L), GeneC = c(8L, 2L, 1L, 8L, 9L, 9L)), 
class = "data.frame", row.names = c(NA, -6L))

我們可以使用base R

df[] <- lapply(df, function(x) table(x)[as.character(x)])

-輸出

> df
  Breed GeneA GeneB GeneC
1     2     4     1     2
2     2     1     3     1
3     1     4     1     1
4     3     4     3     2
5     3     4     3     2
6     3     1     1     2

或者使用tidyverse

library(dplyr)
df %>%
    mutate(across(everything(), ~ tibble(col1 = .x) %>% 
             add_count(col1) %>% 
             pull(n)))
  Breed GeneA GeneB GeneC
1     2     4     1     2
2     2     1     3     1
3     1     4     1     1
4     3     4     3     2
5     3     4     3     2
6     3     1     1     2

數據

df <- structure(list(Breed = c("Collie", "Collie", "Lab", "Pug", "Pug", 
"Pug"), GeneA = c(3L, 5L, 3L, 3L, 3L, 4L), GeneB = c(5L, 7L, 
3L, 7L, 7L, 4L), GeneC = c(8L, 2L, 1L, 8L, 9L, 9L)),
   class = "data.frame", row.names = c(NA, 
-6L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM