[英]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.