Сравнение символьных переменных идентификаторов в двух фреймах данных - PullRequest
0 голосов
/ 23 ноября 2018
merge1 <- within(merge(df1, df2, by=c("ID"),all=F),
 AD <- A.x - A.y                                                  
 BD <- B.x - B.y                                                
 CD <- C.x - C.y
 DC <- ifelse(df1$D != df2$D | df1$D == "TOT" | df2$D == "TOT", 1, 0)
})[,c("ID","AD","BD","CD","DC")] 

Я хочу сравнить статистику идентификаторов по двум наборам данных.Представьте, что каждый д.ф. представляет данные за один год.Это работает точно так, как я хочу, за исключением случаев, когда я пытаюсь добавить переменную «DC» с помощью оператора ifelse.Некоторая информация о наборе данных состоит в том, что они не имеют одинаковую длину, а идентификаторы, которые существовали в df1, могут не существовать в df2, и наоборот.Переменная D в каждом фрейме данных состоит из организаций.Однако я хочу, чтобы новый объединенный df был двоичным файлом того, изменил ли идентификатор организации или нет.Вот почему у меня есть оператор ifelse, где, если D из df1 не совпадает с D из df2, тогда я хочу, чтобы он вывел 1. Также, если D из одного или обоих фреймов данных помечены как TOT, я хочу, чтобы он вывел 1.Я только хочу, чтобы он вывел 0, если df1 $ D = df2 $ D и TOT не назначен идентификатору.Можно ли использовать ifelse (операторы таким образом или я что-то не так делаю? Я немного новичок в R, поэтому я заранее благодарен за помощь.

Edit

Вот код ошибки:

Error in `[<-.data.frame`(`*tmp*`, nl, value = list(TmC = c(1, 1, 0, 1,  : 
 replacement element 1 has 486 rows, need 576
In addition: Warning messages:
1: In if (all.x) all.x <- (nxx <- length(m$x.alone)) > 0L :
 the condition has length > 1 and only the first element will be used
2: In if (all.y) all.y <- (nyy <- length(m$y.alone)) > 0L :
 the condition has length > 1 and only the first element will be used  
3: In is.na(e1) | is.na(e2) :
 longer object length is not a multiple of shorter object length
4: In `!=.default`(nbasumadv1617$Tm, nbasumadv1516$Tm) :
 longer object length is not a multiple of shorter object length
5: In nbasumadv1617$Tm != nbasumadv1516$Tm | nbasumadv1617$Tm == "TOT" |  :
 longer object length is not a multiple of shorter object length

Я описал упрощенную версию имен переменных, которые у меня здесь. Она работала так, как я хотел, без четвертой переменной «DC», которая фактически помечена как TmC в моем реальном коде. Я считаю, что этот код на самом деленичего не производит, так как не показывает ничего отличного от того, что я создал без этой четвертой переменной. Первые два сообщения об ошибках по-прежнему отображаются без четвертой переменной "DC", но это нормально. Последние 3 сообщения об ошибках и ошибка несоответствия заменяющего элемента TmC являются новыми.

1 Ответ

0 голосов
/ 23 ноября 2018

Просто настройте вызов ifelse, чтобы использовать фактические объединенные столбцы Dx и Dy , а не их исходные источники.При объединении все столбцы отображаются одинаковой длины, поскольку по определению фрейм данных представляет собой список атомарных векторов одинаковой длины.Но ссылки на df1$D и df2$D, как вы это делаете изначально, могут иметь различную длину и, следовательно, вашу ошибку.

merge1 <- within(merge(df1, df2, by=c("ID"), all=FALSE),
                 {
                   AD <- A.x - A.y                                                  
                   BD <- B.x - B.y                                                
                   CD <- C.x - C.y
                   DC <- ifelse(D.x != D.y | D.x == "TOT" | D.y == "TOT", 1, 0)
                 } 
          )[,c("ID","AD","BD","CD","DC")] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...