Создать функцию для вменения значений из одного фрейма данных в другой - PullRequest
1 голос
/ 26 марта 2020

Значения NA в столбце A должны быть заполнены значением A из фрейма данных dat и т. Д. Для других переменных.

id <- factor(rep(letters[1:2], each=5))
    A <- c(1,2,NA,6,8,9,0,6,7,9)
    B <- c(5,6,1,9,8,1,NA,9,7,4)
    C <- c(2,3,5,NA,NA,2,7,6,4,6)
    D <- c(6,5,8,3,2,9,NA,2,6,8)
    df <- data.frame(id, A, B,C,D) 
    df

   id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a NA  1  5  8
4   a  6  9 NA  3
5   a  8  8 NA  2
6   b  9  1  2  9
7   b  0 NA  7 NA
8   b  6  9  6  2
9   b  7  7  4  6
10  b  9  4  6  8


dat <- data.frame(col=c("A","B","C","D"), value=c(23,45,26,89))
dat
dat
  col value
1   A    23
2   B    45
3   C    26
4   D    89

Оно должно выглядеть следующим образом:

   id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a 23  1  5  8
4   a  6  9 26  3
5   a  8  8 26  2
6   b  9  1  2  9
7   b  0 45  7 89
8   b  6  9  6  2
9   b  7  7  4  6
10  b  9  4  6  8

Я думал, что-то вроде этого, но я не знаю, как соединить эти кадры данных в функции ...

test <- function(i){
df[,i][is.na(df[,i])] <- dat$value

}
test(2) 

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Если вы хотите это в вашем формате

test <- function(i){
   df[,i][is.na(df[,i])] <<- dat$value[dat$col==i]
}

test("A")
   id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a 23  1  5  8
4   a  6  9 NA  3
5   a  8  8 NA  2
6   b  9  1  2  9
7   b  0 NA  7 NA
8   b  6  9  6  2
9   b  7  7  4  6
10  b  9  4  6  8
1 голос
/ 26 марта 2020

Один из подходов состоит в том, чтобы перебрать столбцы и значения и использовать coalesce():

library(dplyr)
library(purrr)
df[-1] <- map2_df(df[-1], dat$value, coalesce)

df
   id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a 23  1  5  8
4   a  6  9 26  3
5   a  8  8 26  2
6   b  9  1  2  9
7   b  0 45  7 89
8   b  6  9  6  2
9   b  7  7  4  6
10  b  9  4  6  8

или то же самое, используя replace():

map2_df(df[-1], dat$value, ~ replace(.x, is.na(.x), .y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...