2013-11-06 3 views
0

Не могли бы вы сказать мне, как я мог бы превратить кадр данных, как это:Слияния data.frame строк с общим столбцом значения

tg qr loc a1 a2 a3 b1 b2 b3 c1 c2 c3 
1 A 1 89 NA NA NA 1 2 3 1 2 3 
2 A 1 61 1 2 3 NA NA NA 1 2 3 
3 A 2 38 4 5 6 NA NA NA NA NA NA 
4 B 1 40 4 5 6 NA NA NA NA NA NA 
5 B 1 3 NA NA NA NA NA NA 4 5 6 

в это:

tg qr loc a1 a2 a3 b1 b2 b3 c1 c2 c3 
1 A 1 15 1 2 3 1 2 3 1 2 3 
2 A 2 95 4 5 6 NA NA NA NA NA NA 
3 B 1 42 4 5 6 NA NA NA 4 5 6 

Функция должно:

  • объединить все строки с одинаковыми значениями в столбцах 'tg' AND 'qr' в одну строку
  • при слиянии, замените все «NA» на существующие значения - никогда в обратном направлении
  • Часто бывают случаи, когда переменная присутствует в обеих строках, которые объединены, но ее значение всегда будет равно (тогда это не будет " т материя, из какой строки это будет принято)
  • значения столбцов «LOC» различается, но не имеет значения, столбец может быть даже удален

код для этих образцов dataframes является:

df = rbind(c("A","1",floor(runif(1,1,100)),c(NA,NA,NA),c(1,2,3),c(1,2,3)), 
      c("A","1",floor(runif(1,1,100)),c(1,2,3),c(NA,NA,NA),c(1,2,3)), 
      c("A","2",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)), 
      c("B","1",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)), 
      c("B","1",floor(runif(1,1,100)),c(NA,NA,NA),c(NA,NA,NA),c(4,5,6))) 
df = as.data.frame(df) 
colnames(df) = c("target","query","loc",c("a1","a2","a3"),c("b1","b2","b3"),c("c1","c2","c3")) 

df2 = rbind(c("A","1",floor(runif(1,1,100)),c(1,2,3),c(1,2,3),c(1,2,3)), 
      c("A","2",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)), 
      c("B","1",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(4,5,6))) 
df2 = as.data.frame(df2) 
colnames(df2) = c("target","query","loc",c("a1","a2","a3"),c("b1","b2","b3"),c("c1","c2","c3")) 

Благодарим вас за поддержку.

+0

[Что вы пробовали] (http://mattgemmell.com/2008/12/08/what-have-you -tried /) до сих пор? – zero323

+0

'merge (df, df2, by = c (" target "," query "))'? – Metrics

+0

@Metrics Не совсем. У меня нет 'df2'. Я разместил его как образец, который я бы хотел получить. – mjktfw

ответ

2

Использование na.omit:

library(data.table) 
dt = data.table(df) 

dt[, lapply(.SD, function(x) na.omit(x)[1]), by = list(target, query)] 
# target query loc a1 a2 a3 b1 b2 b3 c1 c2 c3 
#1:  A  1 21 1 2 3 1 2 3 1 2 3 
#2:  A  2 71 4 5 6 NA NA NA NA NA NA 
#3:  B  1 25 4 5 6 NA NA NA 4 5 6 
1

Что-то вроде этого, может быть?

library(data.table) 
dt <- data.table(df) 
dt <- dt[,lapply(.SD, as.numeric), by = c("target","query")] 
dt2 <- dt[,lapply(.SD, mean, na.rm = TRUE), by = c("target","query")] 
dt2[is.na(dt2)] <- NA 

dt2

> dt2 
    target query loc a1 a2 a3 b1 b2 b3 c1 c2 c3 
1:  A  1 2.0 1 1 1 1 1 1 1 1 1 
2:  A  2 2.0 2 2 2 NA NA NA NA NA NA 
3:  B  1 2.5 2 2 2 NA NA NA 2 2 2 
+0

это не похоже на то, что хочет OP – eddi

+0

Спасибо за указание таблиц данных. Однако выход не совпадает с тем, который я использую. Я думаю, это будет проблематично, если некоторые из моих значений являются строками? – mjktfw

+0

Спасибо за указание @eddi, я предположил: «Часто бывают случаи, когда переменная присутствует в обеих строках, которые сливаются, но ее значение всегда будет равным (тогда не имеет значения, из какой строки это будет принято) "означало, что мне не нужно было об этом беспокоиться. Видимо, я что-то не понял. – TheComeOnMan

Смежные вопросы