R 如何创建从数据帧返回指定值的函数
我正在创建一个模型来分配等位基因的适合度。我首先为一个群体创建了基因组(这是可行的) 例如,如果在我的pop数据帧中有'AA'返回0.861,我如何获得它R 如何创建从数据帧返回指定值的函数,r,R,我正在创建一个模型来分配等位基因的适合度。我首先为一个群体创建了基因组(这是可行的) 例如,如果在我的pop数据帧中有'AA'返回0.861,我如何获得它 我希望得到的第一行是'AA',返回值为0.861而不是0.498您可以在dplyr中的语句中使用case\u。如果我使用具有列X1和X2的pop数据帧,下面的代码应该可以执行您想要的操作 library(dplyr) popf = function(pop) { pop %>% mutate( result =
我希望得到的第一行是'AA',返回值为0.861而不是0.498您可以在
dplyr
中的语句中使用case\u。如果我使用具有列X1
和X2
的pop
数据帧,下面的代码应该可以执行您想要的操作
library(dplyr)
popf = function(pop) {
pop %>% mutate(
result = case_when(
X1=="A" & X2=="A" ~ 0.861,
X1=="C" & X2=="C" ~ 1,
X1=="S" & X2=="S" ~ 0.109,
X1=="C" & X2=="A" ~ 0.935,
X1=="A" & X2=="C" ~ 0.935,
X1=="A" & X2=="S" ~ 0.979,
X1=="S" & X2=="A" ~ 0.979,
TRUE ~ 0.498)
)
}
popf(pop)
编辑以添加函数包装器。如果您在编写此文件时总是使用带有字母的两列数据框(假设您不想完全重新考虑,例如使用tidyverse)
ind\u fit请添加一个小的测试数据集、您得到的结果和您期望的结果。我不认为你需要问题中的第一个函数,如果你是肯定的,那么结果就是你所期望的。同样在你的代码中,pop
是一个矩阵而不是一个数据帧。如果我在你的编辑中,ind_-fit(1,1)
会给你.498,因为1不是“a”、“C”或“S”。我认为错误在于您的意思是ind_fit(pop$X1,pop$X2)
函数还有其他问题。。。为什么要制作pop矩阵?函数中的pop
与使用其他函数创建的pop
不同。函数内部就像一个独立的宇宙,只有在函数内部才存在,除非传入,否则不引用函数外部的任何内容。您希望将其封装到以pop为参数的函数中。
ind_fit<-function(a,b)
{
pop<-matrix(0,nrow=1,ncol=2)
pop[1,1]<-a
pop[1,2]<-b
indfitness <- ifelse(pop[,1]=="A" & pop[,2]=="A", 0.861,
ifelse(pop[,1]=="C" & pop[,2]=="C", 1,
ifelse(pop[,1]=="S" & pop[,2]=="S", 0.109,
ifelse(pop[,1]=="C" & pop[,2]=="A", 0.935,
ifelse(pop[,1]=="A" & pop[,2]=="C", 0.935,
ifelse(pop[,1]=="A" & pop[,2]=="S", 0.979,
ifelse(pop[,1]=="S" & pop[,2]=="A", 0.979, 0.498)
))))))
return(indfitness)
}
ind_fit(1,1)
0.498
library(dplyr)
popf = function(pop) {
pop %>% mutate(
result = case_when(
X1=="A" & X2=="A" ~ 0.861,
X1=="C" & X2=="C" ~ 1,
X1=="S" & X2=="S" ~ 0.109,
X1=="C" & X2=="A" ~ 0.935,
X1=="A" & X2=="C" ~ 0.935,
X1=="A" & X2=="S" ~ 0.979,
X1=="S" & X2=="A" ~ 0.979,
TRUE ~ 0.498)
)
}
popf(pop)
ind_fit<-function(pop)
{
indfitness <- ifelse(pop[,1]=="A" & pop[,2]=="A", 0.861,
ifelse(pop[,1]=="C" & pop[,2]=="C", 1,
ifelse(pop[,1]=="S" & pop[,2]=="S", 0.109,
ifelse(pop[,1]=="C" & pop[,2]=="A", 0.935,
ifelse(pop[,1]=="A" & pop[,2]=="C", 0.935,
ifelse(pop[,1]=="A" & pop[,2]=="S", 0.979,
ifelse(pop[,1]=="S" & pop[,2]=="A", 0.979, 0.498)
))))))
return(indfitness)
}
pop <- data.frame(X1 = c("A", "A"), X2 = c("C", "S"))
ind_fit<-function(pop)
{
pop$indfitness[pop$X1=="A" & pop$X2=="A"]<-0.861
pop$indfitness[pop$X1=="C" & pop$X2=="C"] <- 1
pop$indfitness[pop$X1=="S" & pop$X2=="S"] <-0.109
pop$indfitness[pop$X1=="C" & pop$X2=="A"] <- 0.935
pop$indfitness[pop$X1=="A" & pop$X2=="C"] <- 0.935
pop$indfitness[pop$X1=="A" & pop$X2=="S"] <- 0.979
pop$indfitness[pop$X1=="S" & pop$X2=="A"] <- 0.979
pop # or pop$indfitness depending on what you want.
}