R фрейм данных вставляет значения на основе другого фрейма данных

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть 2 фрейма данных следующим образом:

 df1
name    date       value df2_row df2_col
a    31-01-2019      1      1       1
b    31-01-2019      3      2       1
c    31-03-2019      5      3       3
d    31-03-2019      6      4       3
  
 df2
name    31-01-2019 28-02-2019 31-03-2019       
a    
b    
c    
d    
  

и я хотел бы получить df2 следующим образом:

 df2
name    31-01-2019     28-02-2019    31-03-2019       
a             1            NA             NA
b             3            NA             NA                 
c             NA           NA             5
d             NA           NA             6
  

Есть идеи?

Комментарии:

1. Каковы ваши идеи? Что вы пробовали? Пожалуйста, поделитесь кодом, который вы использовали и который не удался. Также убедитесь, что приведены воспроизводимые примеры и что ожидаемый результат соответствует этим примерам.

Ответ №1:

Похоже, что name и date в df1 не связаны с конечным результатом. Предполагая, что у вас есть один столбец ( name ) перед NA столбцами, cbind df2_row и df2_col и присваивать value им.

 df2[cbind(df1$df2_row, df1$df2_col)] <- df1$value

#  31-01-2019 28-02-2019 31-03-2019
#1          1         NA         NA
#2          3         NA         NA
#3         NA         NA          5
#4         NA         NA          6
  

данные

Предполагая, что ваш df2 такой

 df2 <- cbind(name = c("a", "b", "c", "d"), 
       setNames(data.frame(matrix(NA, ncol = 3, nrow = 4)), 
       c("31-01-2019","28-02-2019","31-03-2019"))) 

df2
#  name 31-01-2019 28-02-2019 31-03-2019
#1    a         NA         NA         NA
#2    b         NA         NA         NA
#3    c         NA         NA         NA
#4    d         NA         NA         NA
  

Ответ №2:

Мы можем преобразовать подмножество данных в matrix , и оно должно работать как индекс строки / столбца

 df2[-1][as.matrix(df1[c("df2_row", "df2_col")])] <- df1$value
df2
#  name 31-01-2019 28-02-2019 31-03-2019
#1    a          1         NA         NA
#2    b          3         NA         NA
#3    c         NA         NA          5
#4    d         NA         NA          6