перекодирование на основе двух столбцов в остальные столбцы с использованием R - PullRequest
2 голосов
/ 10 февраля 2012

У меня большие данные, мини-версия выглядит следующим образом:

    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 ]

2 голосов
/ 10 февраля 2012

написать небольшую функцию, которая просто делает это для 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 голос
/ 10 февраля 2012

Вы можете сэкономить некоторую работу, когда извлекаете данные, установив:

na.strings="--", чтобы автоматически устанавливать элементы "-" на NA, также вы можете настроить его так, чтобы строкине преобразуется в факторы.as.is=TRUE

См. ?read.table

Эти две настройки означают, что вы сейчас имеете дело с тем, что не учитывается автоматически и имеет NA, где это необходимо.

И ... когда я пишу это, кто-то уже придумал функцию, поэтому я на этом остановлюсь, и вы можете рассматривать это как расширенный комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...