我正在寻找一种在',%'
行中填充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')
)
行。
答案 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]])
}