我正在尝试使用dplyr包,但我面临着处理变量的问题。
假设我有一个简化的数据帧
my.data <- as.data.frame(matrix(NA), ncol=4, nrow=6)
my.data <- as.data.frame(cbind(c("d6", "d7", "d8", "d9", "da", "db"), c(rep("C200", 2), rep("C400", 4)), c(rep("a",5), "b"), c("c", rep("a", 5))))
colnames(my.data) <- c("snp", "gene", "ind1", "ind2")
我首先用group_by计算每个基因的snp数量:
new.data <- my.data %>% group_by(gene) %>% mutate(count = n())
但是我想得到每个单独列的字符串发生百分比:
new.data %>% group_by(gene) %>% filter(grepl("a", ind1)) %>% dplyr::mutate(perc.a.ind1 = n()/count*100)
new.data %>% group_by(gene) %>% filter(grepl("a", ind2)) %>% dplyr::mutate(perc.a.ind2 = n()/count*100)
它工作得很好。问题是我有很多个人,我需要自动化它。所以我创建了一个名称向量,并在for循环中运行我的函数(我知道循环不是最好的,我很乐意升级到应用版本或其他版本)
ind.vec <- colnames(my.data[,3:4])
for (i in 1:length(ind.vec){
new.data %>% group_by(gene) %>% filter(grepl("a", ind.vec[i])) %>% mutate(percent = n()/count*100)
}
我最终得到了一个空的tibble,就像我的ind. vec中没有一个元素被识别一样。
我读了https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html的小插曲,这让我认为我已经发现了问题,但我远远没有理解它,也无法使它与我的数据一起工作。
我做了一些试验
ind.vec <- quote(colnames(my.data[,3:4]))
new.data %>% group_by(gene) %>% filter(grepl("a", !!(ind.vec[i]))) %>% mutate(percent = n()/count*100)
如何使向量元素被dplyr识别?
请你帮忙好吗?
我建议你使用tidyr::为此收集。
library(tidyverse)
# or library(dplyr);library(tidyr)
my.data %>%
group_by(gene) %>%
mutate(count = n()) %>%
gather(ind, string, ind1, ind2 ) %>%
filter(string == "a") %>%
group_by(gene, ind, string) %>%
mutate(
n_string = n(),
freq = n_string / count * 100 )
# A tibble: 10 x 7
# Groups: gene, ind, string [4]
# snp gene count ind string n_string freq
# <fctr> <fctr> <int> <chr> <chr> <int> <dbl>
# 1 d6 C200 2 ind1 a 2 100
# 2 d7 C200 2 ind1 a 2 100
# 3 d8 C400 4 ind1 a 3 75
# 4 d9 C400 4 ind1 a 3 75
# 5 da C400 4 ind1 a 3 75
# 6 d7 C200 2 ind2 a 1 50
# 7 d8 C400 4 ind2 a 4 100
# 8 d9 C400 4 ind2 a 4 100
# 9 da C400 4 ind2 a 4 100
#10 db C400 4 ind2 a 4 100
由于某种原因,我收到了警告,但结果与您提供的结果相同。
@SollanoRabeloBraga,非常感谢!!它解决了我的问题。我修改了收集函数以包含更多个人收集(ind, string,ind1:ind5)
然后我做了
new.data <- test[!duplicated(new.data[, c("gene", "ind", "freq")]),]
new.data <- cast(test2, gene ~ ind)
打磨我的结果。