2016-05-31 5 views
-1

У меня есть два dataframes:сравнить data.frames с различным числом строк для

df1<- data.frame(POS=c(1, 2, 3, 4, 5), 
      A=c(0.2,0,0,0.8,0), 
      G=c(0,0.3,0,0.2,0.5), 
      T=c(0.4,0.7,1,0,0.5), 
      C=c(0.4,0,0,0,0)) 

df2<- data.frame(POS=c(1, 3, 4, 5, 6), 
      A=c(0.3,0,0.6,0,0), 
      G=c(0,0,0.4,0.7,1), 
      T=c(0.2,1,0,0.3,0), 
      C=c(0.5,0,0,0,0)) 

Я хотел бы получить суммированные квадратов разностей для каждого POS

Первое, что нужно две матрицы из те же размеры. Как добавить строку для отсутствующих позиций, заполненных 0?

Как только у меня есть две матрицы, я сделаю (df1-df2)^2, а затем подход рядов.

Подводя итог: Как добавить новую строку, заполненную нулями для недостающих строк в каждом data.frame?

так:

POS A G T C 
1 0.2 0.0 0.4 0.4 
2 0.0 0.3 0.7 0.0 
3 0.0 0.0 1.0 0.0 
4 0.8 0.2 0.0 0.0 
5 0.0 0.5 0.5 0.0 
6 0.0 0.0 0.0 0.0 

POS A G T C 
1 0.3 0.0 0.2 0.5 
2 0.0 0.0 0.0 0.0 
3 0.0 0.0 1.0 0.0 
4 0.6 0.4 0.0 0.0 
5 0.0 0.7 0.3 0.0 
6 0.0 1.0 0.0 0.0 

ответ

3

По словам Zheyuan Ли в комментариях, вы можете использовать merge() каждого ДФ с колонкой POS другого одного ФР на первой колонке (POS). Это добавляет отсутствующие строки, которые заполнены NA, чтобы вы затем заполнить их нули:

df1 <- merge(df1, df2$POS, all = TRUE, by=1) 
df1[is.na(df1)] <- 0 
df1 
    POS A G T C 
1 1 0.2 0.0 0.4 0.4 
2 2 0.0 0.3 0.7 0.0 
3 3 0.0 0.0 1.0 0.0 
4 4 0.8 0.2 0.0 0.0 
5 5 0.0 0.5 0.5 0.0 
6 6 0.0 0.0 0.0 0.0 

df2 <- merge(df2, df1$POS, all = TRUE, by=1) 
df2[is.na(df2)] <- 0 
df2 
    POS A G T C 
1 1 0.3 0.0 0.2 0.5 
2 2 0.0 0.0 0.0 0.0 
3 3 0.0 0.0 1.0 0.0 
4 4 0.6 0.4 0.0 0.0 
5 5 0.0 0.7 0.3 0.0 
6 6 0.0 1.0 0.0 0.0 
+0

Это работает на данный пример, однако я имею трудность, реализующее это в мои реальные данные. Я получаю ошибки, связанные с «BY». 'Ошибка в файле merge.data.table (mass, evo $ POS, all = TRUE, by.x =" POS ", by.y = 1): Нечетный вектор имен столбцов требуется для by.x и by.y.' или 'Ошибка в файле merge.data.table (mass, evo $ POS, all = TRUE, by =" POS "): Элементы, перечисленные в' by', должны быть действительными именами столбцов в x и y ' –

+0

Не могли бы вы объяснить, почему вы выбираете' by = 1'? Мое понимание 'merge()' заключается в использовании используемого имени столбца (т. Е. POS) –