R 如何创建从数据帧返回指定值的函数

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 =

我正在创建一个模型来分配等位基因的适合度。我首先为一个群体创建了基因组(这是可行的)

例如,如果在我的pop数据帧中有'AA'返回0.861,我如何获得它


我希望得到的第一行是'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.
}