有效地创建多个变量使用R中的apply

时间:2014-10-10 17:28:16

标签: database r variables apply lapply

我有一个包含大量变量的数据帧DF。每个变量都出现两次,因为我正在对#34;夫妇进行分析。

其中,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示例的链接:http://shorttext.com/5d90dd64

每次" .1"," .2"代表夫妻成员考虑。

我的目标: 对于每个指标divI和charJ,我想创建另一个变量DF$divchar,在DF$divI.1> DF$charJ.1时获取值DF$charJ.2; DF$divI.2< DF$charJ.1时的DF$charJ.2

这是我提出的解决方案,似乎有些错综复杂,有时表现得很奇怪:

  1. 我创建了一系列二进制变量,如果DF$charJ.1> DF$charJ.2,则值为1。它们存储在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]])
                ))
    
  2. 我创建了函数BinaryExtract

    BinaryExtract <- function(var1, var2, extract) {var1*extract +var2*(1-extract)}
    
  3. 我创建了矩阵NameFull,其中包含divchar的所有可能组合,以"YY"分隔

    NameFull <- sapply(c("div1",...,"divN")
        , function(nam) paste(nam, names(DF$YMax.1), sep="YY")
    
  4. 然后我创建了所有变量:

     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]]))       
    
  5. 我的问题

    一个。对于简单的事情来说,它看起来是一个非常复杂的解我错过了什么?

    B中。此外,当我打印DF时,只需在命令窗口中键入DF,我就看不到变量NameFull。它们似乎以char的名称出现。 这就是我得到的:http://shorttext.com/5d9102c

    同样,我试图改变他们的所有名字,以摆脱&#34; YY&#34;它似乎不起作用:

       names(DF[, as.vector(NameFull)]) <- as.vector(c("div1",...,"divN"), sapply(, function(nam) 
        paste(nam, names(DF$YMax.1), sep=".")))
    

    当我查看names(DF)时,我会继续使用"YY"

    获取旧名称

    但是,如果我明确地要求他们,我会得到一个结果

     > DF[,"divIYYcharJ"]
    

    我真的很感激任何建议,评论和解释。我很新R广告更习惯于Stata。我觉得这里有一些非常低效的东西。感谢

0 个答案:

没有答案