我正在使用dplyr重写我的所有代码,并需要mutate/mutate_at函数的帮助.我需要的是将自定义函数应用于我的表中的两列.理想情况下,我会通过它们的索引来引用这些列,但现在我甚至无法通过名称引用它.
功能是:
binom.test.p <- function(x) {
if (is.na(x[1])|is.na(x[2])|(x[1]+x[2])<10) {
return(NA)
}
else {
return(binom.test(x, alternative="two.sided")$p.value)
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据:
table <- data.frame(geneId=c("a", "b", "c", "d"), ref_SG1_E2_1_R1_Sum = c(10,20,10,15), alt_SG1_E2_1_R1_Sum = c(10,20,10,15))
Run Code Online (Sandbox Code Playgroud)
所以我这样做:
table %>%
mutate(Ratio=binom.test.p(c(ref_SG1_E2_1_R1_Sum, alt_SG1_E2_1_R1_Sum)))
Error: incorrect length of 'x'
Run Code Online (Sandbox Code Playgroud)
如果我做:
table %>%
mutate(Ratio=binom.test.p(ref_SG1_E2_1_R1_Sum, alt_SG1_E2_1_R1_Sum))
Error: unused argument (c(10, 20, 10, 15))
Run Code Online (Sandbox Code Playgroud)
第二个错误可能是因为我的函数需要一个向量而是获得两个参数.
但即使忘记了我的功能.这有效:
table %>%
mutate(sum = ref_SG1_E2_1_R1_Sum + alt_SG1_E2_1_R1_Sum)
Run Code Online (Sandbox Code Playgroud)
这不是:
table %>%
mutate(.cols=c(2:3), .funs=funs(sum=sum(.)))
Error: wrong result size (2), expected 4 or 1
Run Code Online (Sandbox Code Playgroud)
所以这可能是我对dplyr如何工作的误解.
(以下场景简化了我的实际情况)
我的数据来自村庄,我想通过一个村庄变量来总结一个结果变量。
> data
village A Z Y
<chr> <int> <int> <dbl>
1 a 1 1 500
2 a 1 1 400
3 a 1 0 800
4 b 1 0 300
5 b 1 1 700
Run Code Online (Sandbox Code Playgroud)
例如,我想计算Y仅Z==z由村庄使用的平均值。在这种情况下,我希望村庄“a”为 (500 + 400)/2 = 450,村庄“b”为 700。
请注意,实际情况更复杂,我不能直接使用这个答案,但重点是我需要将分组的 tibble 和全局变量 (z) 传递给我的函数。
z <- 1 # z takes 0 or 1
data %>%
group_by(village) %>% # grouping by village
summarize(Y_village = Y_hat_village(., z)) # pass …Run Code Online (Sandbox Code Playgroud) 给出以下data.frame
d <- rep(c("a", "b"), each=5)
l <- rep(1:5, 2)
v <- 1:10
df <- data.frame(d=d, l=l, v=v*v)
df
d l v
1 a 1 1
2 a 2 4
3 a 3 9
4 a 4 16
5 a 5 25
6 b 1 36
7 b 2 49
8 b 3 64
9 b 4 81
10 b 5 100
Run Code Online (Sandbox Code Playgroud)
现在我想在l分组之后添加另一列.额外列应包含v_b - v_a的值
d l v e
1 a 1 1 35 (36-1)
2 a 2 4 45 …Run Code Online (Sandbox Code Playgroud)