Database 使用apply-in-R高效地创建多个变量

Database 使用apply-in-R高效地创建多个变量,database,r,variables,apply,lapply,Database,R,Variables,Apply,Lapply,我有一个数据帧DF,它包含许多变量。每个变量出现两次,因为我正在对“夫妇”进行分析 除其他外,DF有一系列多样性指标: DF$div1.1, DF$div2.1, .... , DF$divN.1, DF$div.1.2, ..., DF$divN.2 同样,它还有一系列另一个特点的指标: DF$char1.1, DF$char2.1, .... , DF$charM.1, DF$char.1.2, ..., DF$charM.2 以下是指向DF示例的链接: 每次“.1”和“.2”代表所

我有一个数据帧DF,它包含许多变量。每个变量出现两次,因为我正在对“夫妇”进行分析

除其他外,DF有一系列多样性指标:

 DF$div1.1, DF$div2.1, .... , DF$divN.1, DF$div.1.2, ..., DF$divN.2
同样,它还有一系列另一个特点的指标:

 DF$char1.1, DF$char2.1, .... , DF$charM.1, DF$char.1.2, ..., DF$charM.2
以下是指向DF示例的链接:

每次“.1”和“.2”代表所考虑的夫妻成员

我的目标: 对于每个指标divI和charJ,我想创建另一个变量
DF$divchar
,当
DF$charJ.1
DF$charJ.2
时,该变量取值
DF$divI.1
;和
DF$divI.2
DF$charJ.1
DF$charJ.2
时。存储在
DF$CharMax.1
下。 下面是我如何创建它的:

DF$CharMax.1 <- as.data.frame(
    sapply(1:length(nam), 
        function(n) 
        as.numeric(DF[names(DF)==names.1[n]] 
        >DF[names(DF)==names.2[n]])
            ))
  • 我创建了矩阵
    NameFull
    ,其中包含
    div
    char
    的所有可能组合,用
    “YY”
    分隔

    当我查看
    names(DF)
    时,我总是用
    “YY”

    然而,如果我显式地调用它们,我确实会得到一个结果

     > DF[,"divIYYcharJ"]
    

    如有任何建议、评论和解释,我将不胜感激。我对R很陌生,他更习惯于斯塔塔。我觉得这里有一些非常低效的东西。谢谢

    只需将data.frame转换为长格式即可。问题就变得很简单了。您应该阅读。
    apply(df,1,函数(x){sapply(seq(1,length(x),2),函数(x){ifelse((x[i]>x[i+1]),x[1],x[2])})
    尝试对每行中的列进行行操作。假设每一对的列彼此相邻。您还需要确保df只包含特征列。谢谢您的回答@罗兰:我曾考虑过整形手术,但由于我有很多观察(21800对夫妇),我担心整形手术会花很长时间,而且在那之后,所有手术都会花很长时间long@Doon_Bogan如果您使用package data.table,重塑应该几乎是即时的。
    NameFull <- sapply(c("div1",...,"divN")
        , function(nam) paste(nam, names(DF$YMax.1), sep="YY")
    
     DF[, as.vector(NameFull)] <-   lapply(as.vector(NameFull),   function(e) 
        BinaryExtract(DF[,paste0(unlist(strsplit(e,"YY"))[1],".1")] 
        , DF[, paste0(unlist(strsplit(e,"YY"))[1],".1")]
        , DF$charMax.1[unlist(strsplit(e,"YY"))[2]]))       
    
       names(DF[, as.vector(NameFull)]) <- as.vector(c("div1",...,"divN"), sapply(, function(nam) 
        paste(nam, names(DF$YMax.1), sep=".")))
    
     > DF[,"divIYYcharJ"]