从不同的数据帧插入缺失值并生成许多数据帧

时间:2017-10-05 21:48:05

标签: r loops dataframe dplyr missing-data

我有许多行和列中的示例输入文件DF1,缺少数据并希望从不同的数据帧DF2中估算丢失的数据并生成许多数据帧,如输出中所示ans保存为数据框。任何人都可以帮助解决这个问题。

输入:

DF1: 

GM  A   B   C   D   E
1   22  34  56  345 76
2   34  44  777 67  NA
3   45  76  77  NA  NA
4   56  88  NA  NA  NA
5   36  NA  NA  NA  NA

DF2

V1  V2  V3
1   11  21
2   12  22
3   13  23
4   14  24
5   15  25
6   16  26
7   17  27
8   18  28
9   19  29
10  20  30

输出:

OutputV1:

GM  A   B   C   D   E
1   22  34  56  345 76
2   34  44  777 67  1
3   45  76  77  2   3
4   56  88  4   5   6
5   36  7   8   9   10

OutputV2

GM  A   B   C   D   E
1   22  34  56  345 76
2   34  44  777 67  11
3   45  76  77  12  13
4   56  88  14  14  16
5   36  17  18  19  20

输出3:

GM  A   B   C   D   E
1   22  34  56  345 76
2   34  44  777 67  21
3   45  76  77  22  23
4   56  88  24  25  26
5   36  27  28  29  30

我确实把图片清楚地说明了将DF2的值添加到输出数据帧

OuputV1:

FIrst Output

OutputV2:

enter image description here

如果有人帮我解决这个问题会很棒,因为DF2中有许多变量,需要根据变量的数量生成许多数据帧。

1 个答案:

答案 0 :(得分:1)

您可以转置 DF1 ,填充缺失的值,然后将其转置回来:

t_df <- t(df1)
t_df[is.na(t_df)] <- df2$V1
as.data.frame(t(t_df))

#  GM  A  B   C   D  E
#1  1 22 34  56 345 76
#2  2 34 44 777  67  1
#3  3 45 76  77   2  3
#4  4 56 88   4   5  6
#5  5 36  7   8   9 10

如果所有列具有相同的数据类型,则此方法效果最佳,否则数据类型可能会因转置而混淆。

impute_by_row <- function(df, values) {
    t_df <- t(df)
    t_df[is.na(t_df)] <- values
    as.data.frame(t(t_df))
}

impute_by_row(df1, df2$V1)
#  GM  A  B   C   D  E
#1  1 22 34  56 345 76
#2  2 34 44 777  67  1
#3  3 45 76  77   2  3
#4  4 56 88   4   5  6
#5  5 36  7   8   9 10

impute_by_row(df1, df2$V2)
#  GM  A  B   C   D  E
#1  1 22 34  56 345 76
#2  2 34 44 777  67 11
#3  3 45 76  77  12 13
#4  4 56 88  14  15 16
#5  5 36 17  18  19 20

impute_by_row(df1, df2$V3)
#  GM  A  B   C   D  E
#1  1 22 34  56 345 76
#2  2 34 44 777  67 21
#3  3 45 76  77  22 23
#4  4 56 88  24  25 26
#5  5 36 27  28  29 30

将该函数应用于df2的所有列:

lapply(df2, function(v) impute_by_row(df1, v))

$V1
  GM  A  B   C   D  E
1  1 22 34  56 345 76
2  2 34 44 777  67  1
3  3 45 76  77   2  3
4  4 56 88   4   5  6
5  5 36  7   8   9 10

$V2
  GM  A  B   C   D  E
1  1 22 34  56 345 76
2  2 34 44 777  67 11
3  3 45 76  77  12 13
4  4 56 88  14  15 16
5  5 36 17  18  19 20

$V3
  GM  A  B   C   D  E
1  1 22 34  56 345 76
2  2 34 44 777  67 21
3  3 45 76  77  22 23
4  4 56 88  24  25 26
5  5 36 27  28  29 30