2016-05-03 3 views
3

У меня есть N x M фрейм данных DF1 с именами строк и столбцов, где многие значения являются NA. Существует второй кадр данных DF2 (1 x M, поэтому действительно может быть вектором) с именами строк, идентичными DF1. Я хотел бы использовать DF2 для заполнения отсутствующих значений в столбцах DF1.Заполнение отсутствующих значений в data.frame из другого data.frame

Любая помощь была бы действительно оценена.

Udp: К сожалению, на самом деле должны были прикрепил пример

Dataframe НСБУ

> df = data.frame(matrix(rnorm(9), nrow=3)) 
> df[1,1] <- NA 
> df[2,2] <- NA 
> df[3,3] <- NA 
      X1   X2   X3 
1   NA -0.1364313   NA 
2 -0.7473972   NA -0.1662138 

значения замещения (те же имена строк, столбцов - неуместные

df2 = data.frame(c(1,2)) 
    c.1..2. 
1  1 
2  2 

Ожидаемый результат:

  X1   X2   X3 
1   1 -0.1364313   1 
2 -0.7473972   2 -0.1662138 
+0

Как DF2 может заполнить DF1, если это М х 1? DF1 будет иметь в n раз большее количество ячеек, чем DF1 – cgage

+0

. Вам нужно привести пример своей проблемы, включая данные образца и ожидаемый результат – SymbolixAU

+0

, пожалуйста, предоставьте воспроизводимый код с образцами данных – HubertL

ответ

1

Вот один из способов сделать это, я думаю. Во-первых, я создаю новый data.frame (new_df) с выбранными только соответствующими строками, затем я делаю sapply над данными для замены значений NA.

set.seed(123) 
df = data.frame(matrix(rnorm(9), nrow=3)) 
df[1,1] <- NA 
df[2,2] <- NA 
df[3,3] <- NA 
df2 <- data.frame(c(1,2)) 
#create new data.frame 
new_df <- df[which(row.names(df2) == row.names(df)),] 
#use sapply() 
t(sapply(row.names(df2), FUN = function(x) 
    ifelse(is.na(new_df[row.names(new_df) == x,]), 
      df2[row.names(df2)== x,], 
      new_df[row.names(new_df) == x,]))) 

    [,1]  [,2]  [,3]  
1 1   0.07050839 0.4609162 
2 -0.2301775 2   -1.265061 

Обратите внимание, что это приводит к потере названий столбцов ... что, вероятно, означает, что есть лучший способ сделать это. Кроме того, мои данные разные, поскольку мы не использовали set.seed.

1

Вы можете также сделать простой цикл, который будет заботиться об этом:

for(i in 1:dim(df)[1]){ 
    df[i,is.na(df[i,])] <- df2[i,] 
} 
Смежные вопросы