如何为准相同行在R中填充NA?

时间:2019-01-02 15:42:57

标签: r duplicates na

我正在寻找一种在',%'行中填充NA的方法。总共有相同的行,一次有一个NA,所以我决定用完整行的值填充这一行,但我不知道如何处理。

使用duplicated()函数,我可以得到一个像这样的数据帧:

duplicated()

行是相似的,那么如何通过前面的raw值(不是NA)来感觉NA?没有 df <- data.frame( Year = rnorm(5), hour = rnorm(5), LOT = rnorm(5), S123_AA = c('ABF4576','ABF4576','ABF4576','ABF4576','ABF4576'), S135_AA = c('ABF5403',NA,'ABF5403','ABF5403','ABF5403'), S13_BB = c('BF50343','BF50343','BF50343','BF50343',NA), S1763_BB = c('AA3489','AA3489','AA3489','AA3489','AA3489'), S173_BB = c('BQA0478','BQA0478','BQA0478','BQA0478','BQA0478'), S234543 = c('AD4352','AD4352','AD4352','AD4352','AD4352'), S1265UU5 = c('AZERTY', 'AZERTY', 'AZERTY', 'AZERTY','AZERTY') ) 行。

3 个答案:

答案 0 :(得分:1)

您可以遍历数据并找到第一个无NA值,然后用该值替换NA值

df.repartition(200).write.mode("append").parquet("path/parquet_name")

或者,您也可以按元素查看数据元素,并使用嵌套的for循环从相关单元格的上方或下方获取无NA值。

# Loop through the data
for(c in 1:ncol(df)) {
    vals <- df[,c]
    noneNA <- vals[!is.na(vals)][1]
    vals[is.na(vals)] <- noneNA
    df[,c] <- vals
}

答案 1 :(得分:1)

阅读您的问题使我想到了数据框的imputation problem

换句话说,您需要用某种值填充NA,以便能够“保存”数据框中的记录。最简单的方法是通过搜索均值(当处理基数值时)或模式(当处理分类值时)来选择特定列的值[您也可以执行回归,但我想这是一个更复杂的方法]

在这种情况下,我们可以选择模式替换,因为属性是分类的。通过运行代码,我们获得数据帧df

         Year       hour         LOT S123_AA S135_AA  S13_BB S1763_BB S173_BB S234543 S1265UU5
1 -0.32837526  0.7930541 -1.10954824 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
2  0.55379245 -0.7320060 -0.95088434 ABF4576    <NA> BF50343   AA3489 BQA0478  AD4352   AZERTY
3  0.36442118  0.9920967 -0.07345038 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
4 -0.02546781 -0.1127828 -1.78241434 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
5  1.92550340 -1.0531371  0.88318695 ABF4576 ABF5403    <NA>   AA3489 BQA0478  AD4352   AZERTY

然后我们可以创建一个函数来计算特定列的模式:

getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}

然后使用它来填充缺少的值。在用于为列S135_AA填充缺失值的代码下面(我创建了一个名为workdf的新数据框):

workdf <- df
workdf[is.na(workdf$S135_AA),c('S135_AA')] <- getmode(workdf[,'S135_AA'])

在以下输出中,您可以看到S135_AA NA列是该列的重复出现次数最多的值:

         Year       hour         LOT S123_AA S135_AA  S13_BB S1763_BB S173_BB S234543 S1265UU5
1 -0.32837526  0.7930541 -1.10954824 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
2  0.55379245 -0.7320060 -0.95088434 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
3  0.36442118  0.9920967 -0.07345038 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
4 -0.02546781 -0.1127828 -1.78241434 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
5  1.92550340 -1.0531371  0.88318695 ABF4576 ABF5403    <NA>   AA3489 BQA0478  AD4352   AZERTY

如果您的目标是清理数据,我想您应该使用插补方法来处理它。

答案 2 :(得分:0)

您可以执行以下操作:

library(zoo)

# get cols with missing values
na_cols <- names(df)[colSums(is.na(df)) > 0]

# fill the missing value backwards
for (i in na_cols){
    df[[i]] <- na.locf(df[[i]])
}