如何填写空白单元格?

时间:2015-06-03 16:30:58

标签: r

我有一个csv文件,其中某些列中的某些条目为空。我有相应的列,其中包含可用于填充空白字段的数据。让我们说其中一个带有空格的列称为旧信息,其中一个带有替换信息的列称为新信息。我不想用旧信息替换旧信息,我只想用旧信息中的数据填写旧信息中的空白。数据将来自同一行,即如果旧信息行1为空,则信息将从新信息行1中获取。

此外,我有一个辅助列,也有替换信息,可以称为辅助替换信息。如果旧信息行1为空,新信息行1也是空白,那么我希望将旧信息行1替换为辅助替换信息行1.以下是一些示例数据:

    Old Info     New Info   Secondary Replacement Info
1      Carl         Carl               Carl
2                   Diana              Diana
3      Jeremy       Jeremy             Jeremy
4                                      Jack

这是理想的结果:

    Old Info     New Info   Secondary Replacement Info
1      Carl         Carl               Carl
2      Diana        Diana              Diana
3      Jeremy       Jeremy             Jeremy
4      Jack                            Jack

正如您所看到的,旧信息中的空白已填写。第2行由新信息填写,但第4行由次要替换信息填写,因为新信息也有空白。我如何编写一个函数来完成所有这些?

2 个答案:

答案 0 :(得分:3)

#import your data
#don't forget to set stringsAsFactors = FALSE
DF <- read.csv(text = "Old Info,New Info,Secondary Replacement Info
1,Carl,Carl,Carl
2,,Diana,Diana
3,Jeremy,Jeremy,Jeremy
4,,,Jack", stringsAsFactors = FALSE)

#a little function
fun <- function(x, y, z) {
  y[y == ""] <- z[y == ""] #substitute missings in y with values from z
  x[x == ""] <- y[x == ""] #substitute missings in x with values from y
  x #return
}

DF <- within(DF, Old.Info <- fun(Old.Info, New.Info, Secondary.Replacement.Info))
#  Old.Info New.Info Secondary.Replacement.Info
#1     Carl     Carl                       Carl
#2    Diana    Diana                      Diana
#3   Jeremy   Jeremy                     Jeremy
#4     Jack                                Jack

答案 1 :(得分:1)

这是一个for循环,可能效率不高,但它是一个函数,它应该完成工作。我正在输入我用于输入的文件,这是一个csv(就像你的文本,但不像你的示例输入),所以如果我应该切换它,请告诉我。

#read in csv file
data = read.csv("/Users/amckenz/Documents/github/R-plots/SO/replace_data.txt", fill = T, na.strings = "")

replace_missing_info <- function(data_df){

    for(i in 1:nrow(data_df)){
        print(i)
        if(is.na(data_df[i, 1])){
            if(!is.na(data_df[i, 2])){
                data_df[i, 1] = data_df[i, 2]
            } else if(!is.na(data_df[i, 3])){
                data_df[i, 1] = data_df[i, 3]
            }
        }
    }

    return(data_df)

}

updated_data = replace_missing_info(data_df = data)

输入数据文件:

Old Info,New Info,Secondary Replacement Info
Carl,Carl,Carl
,Diana,Diana
Jeremy,Jeremy,Jeremy
,,Jack

ETA:请注意我在空白条目中读取NA,因此您可以通过na.strings =“”参数使用R的漂亮NA处理系统。如果输入数据不同,可以调整此值。

第二次编辑(每条评论):如果要按名称而不是列号访问列,则可以使用以下代码进行函数和函数调用:

replace_missing_info <- function(data_df, column_with_blanks, 
    primary_replacement_column, secondary_replacement_column){

    for(i in 1:nrow(data_df)){
        print(i)
        if(is.na(data_df[i, column_with_blanks])){
            if(!is.na(data_df[i, primary_replacement_column])){
                data_df[i, column_with_blanks] = data_df[i, primary_replacement_column]
            } else if(!is.na(data_df[i, secondary_replacement_column])){
                data_df[i, column_with_blanks] = data_df[i, secondary_replacement_column]
            }
        }
    }

    return(data_df)

}

updated_data = replace_missing_info(data_df = data, "Old.Info", "New.Info", "Secondary.Replacement.Info")