我有一个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行由次要替换信息填写,因为新信息也有空白。我如何编写一个函数来完成所有这些?
答案 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")