使用R将基于两列的列重新编码到其余列

时间:2012-02-10 18:45:00

标签: r loops dataset format

我有大数据,迷你版如下:

    Pr1  <- c("AA", "BB", "BB", "BB", "BB", "--", "AA", "--")
    Pr2  <- c("BB", "AA", "AA", "AA", "AA", "--", "--", "BB")
    varA  <- c("BB", "AA", "AA", "BB", "BB", "AA", "--", "BB")
    varB  <- c("AA", "BB", "AA", "BB", "BB", "AA", "--", "BB")
    varC <- c("AB", "--", "AB", "BB", "AB", "AA", "--", "AB")
    varD <- c("BB", "AA", "AB", "BB", "BB", "AB", "AB", "BB")
     mydf <- data.frame (Pr1, Pr2, varA, varB, varC, varD)

数据如下所示:

     mydf 

   Pr1 Pr2 varA varB varC varD
1  AA  BB   BB   AA   AB   BB
2  BB  AA   AA   BB   --   AA
3  BB  AA   AA   AA   AB   AB
4  BB  AA   BB   BB   BB   BB
5  BB  AA   BB   BB   AB   BB
6  --  --   AA   AA   AA   AB
7  AA  --   --   --   --   AB

8  --  BB   BB   BB   AB   BB

我需要根据前两个来重新编码数据帧中的其余变量:

如果varA到varD的元素(数据集的结尾) -

  • 等于Pr1值,varA到varD的元素将是“A”,
  • 等于Pr2值,varA到varD的元素将是“B”

  • 既不等于Pr1和Pr2也不等于varA到varD将是“H”

但是 - 缺少值,上述规则不适用于该情况。

如果Pr1和Pr2缺失( - ),那么对于所有值,比较结果为“NA”。

如此预期的结果:

   Pr1 Pr2 varA varB varC varD
1  AA  BB   B    A    H    B
2  BB  AA   B    A   --    B
3  BB  AA   B    B    H    H
4  BB  AA   A    A    A    A
5  BB  AA   A    A    H    A
6  --  --   NA   NA   NA   NA
7  AA  --   NA   NA   NA   NA

8  --  BB   NA   NA   NA   NA

我可以找到一种方法来执行它。

2 个答案:

答案 0 :(得分:2)

写一个小功能,只做1行,然后应用它。我发现首先转换为矩阵很方便

    mymat <- as.matrix(mydf)
    recodeRows <- function(x){
        if (any(x[1:2]=="--")){
             x[3:ncol(mymat)] <- NA
        } else {
             x[3:ncol(mymat)][x[3:ncol(mymat)]==x[1]] <- "A"
             x[3:ncol(mymat)][x[3:ncol(mymat)]==x[2]] <- "B"
             x[3:ncol(mymat)][!x[3:ncol(mymat)] %in% c("A","B","--")] <- "H"
        }
    x
    }
    t(apply(mymat,1,recodeRows))

[编辑包括约翰的ncol(mymat)评论]

答案 1 :(得分:1)

通过设置:

来提取数据时,您可以节省一些工作

na.strings="--"自动将“ - ”元素设置为NA,您也可以将其设置为不将字符串转换为因子。 as.is=TRUE

请参阅?read.table

这两个设置意味着你现在正在处理那些不是自动因素并且NA应该在哪里的东西。

而且......当我写这篇文章时,有人已经提出了一个函数,所以我会停在那里,你可以把它视为一个扩展的评论。