如何为准同一行在R中填写NA?

如何为准同一行在R中填写NA?,r,duplicates,na,R,Duplicates,Na,我正在寻找一种方法来填充duplicated()行。有完全相同的行,同时有一个NA,所以我决定用完整行的值来填充这个行,但我不知道如何处理它 使用duplicated()函数,我可以得到如下数据帧: df <- data.frame( Year = rnorm(5), hour = rnorm(5), LOT = rnorm(5), S123_AA = c('ABF4576','ABF4576','ABF4576','ABF4576','ABF4576'),

我正在寻找一种方法来填充
duplicated()
行。有完全相同的行,同时有一个NA,所以我决定用完整行的值来填充这个行,但我不知道如何处理它

使用
duplicated()
函数,我可以得到如下数据帧:

 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')
 )

df您可以循环遍历数据,找到第一个无NA值,并用该值替换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
}
#在数据中循环
用于(c/1:ncol(df)){

VAL您可以循环遍历数据,找到第一个非NA值,并用该值替换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
}
#在数据中循环
用于(c/1:ncol(df)){

VAL您可以执行以下操作:

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]])
}
图书馆(动物园)
#获取缺少值的col
na_cols 0]
#向后填充缺少的值
对于(我在na_cols){

df[[i]]您可以执行以下操作:

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]])
}
图书馆(动物园)
#获取缺少值的col
na_cols 0]
#向后填充缺少的值
对于(我在na_cols){

df[[i]]读了你的问题后,我想到了一个用于数据帧的方法

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

在这种情况下,我们可以选择模式替换,因为属性是分类的。通过运行代码,我们可以获得数据帧
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
这是一个输出,您可以看到列
S135_AA
NAs采用了列中最常出现的值:

         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
年时标段S123_AA S135_AA S13_BB S1763_BB S173_BB S234543 S1265UUU5
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.025467881-0.1127828-1.78241434 ABF4576 ABF5403 BF50343 AA3489 BQA0478 AD4352 AZERTY
5 1.92550340-1.0531371 0.88318695 ABF4576 ABF5403 AA3489 BQA0478 AD4352 AZERTY

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

阅读您的问题让我想到了数据框架的一种方法

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

在这种情况下,我们可以选择模式替换,因为属性是分类的。通过运行代码,我们可以获得数据帧
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
这是一个输出,您可以看到列
S135_AA
NAs采用了列中最常出现的值:

         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
年时标段S123_AA S135_AA S13_BB S1763_BB S173_BB S234543 S1265UUU5
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.025467881-0.1127828-1.78241434 ABF4576 ABF5403 BF50343 AA3489 BQA0478 AD4352 AZERTY
5 1.92550340-1.0531371 0.88318695 ABF4576 ABF5403 AA3489 BQA0478 AD4352 AZERTY

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

谢谢您的回答,我的问题是没有
complete.cases()
行。可以在前一行或后第三行获取值感谢您的帮助,我只需更改
(r-1,r+1)
part.你知道有什么函数可以在完整的数据帧中“替换”这个子集吗?这里只是一个类似的行,我想在一行给定5个或更多键的完整df中重新整合它。这里的代码在完整的数据集中循环。语句df[r,c]我的df是另一个完整df的一个子集。这里是相似的行。在这种情况下,听起来像你的示例数据,它不能完全代表你试图解决的问题。问题中的示例太棒了。你有什么方法可以调整它以包括完整数据集中的不同行吗?谢谢你的回答,我的问题是没有
complete.cases()
行。该值可以在前一行或后第三行获取。谢谢您的帮助,我只需更改
(r-1,r+1)
part.你知道有什么函数可以在完整的数据帧中“替换”这个子集吗?这里只是一个类似的行,我想在一行给定5个或更多键的完整df中重新整合它。这里的代码在完整的数据集中循环。语句df[r,c]这里我的df是完整的另一个df的子集。这里是相似的行。在这种情况下,听起来像你的示例数据,它不能完全代表你试图解决的问题。问题中的示例太棒了。你有什么方法可以调整它以包括完整数据集中的不同行吗?谢谢你的帮助xplicit答案。只是一个问题,这里是所有行都相似的子集,但在完整DF上是否仍有处理NA的方法?有多组不同的“相同”RAW?模式如何处理它?例如:您正在考虑
S135_AA
包含不同值而不仅仅是“ABF5403”的情况在这种情况下,该模式将使用最频繁的值,并将其归咎。事实上,从您的启动数据框中,您有NAs,所以如果您想保持一个PAR。