根据字符串的子集有条件地填充缺失值

时间:2017-03-04 11:40:12

标签: r missing-data

我有一个包含缺失值的数据框。这些缺失值跨越多个变量但在所述变量中同时出现在特定观察上。例如,我的数据框看起来像:

r1 = c('', 'abc def', '')
r2 = c('1', 'ghi jkl', '2')
r3 = c('', 'mno pqr', '')
df = as.data.frame(rbind(r1, r2, r3))

我想在df $ V2包含'def'的所有情况下用“x”填充两个缺失值,在df $ V2包含'pqr'的所有情况下用“y”填充缺失值,并且单独留下df $ V2包含'jkl'的所有行。换句话说,我想得到一个看起来像这样的数据框:

    V1  V2      V3
r1  x   abc def     x
r2  1   ghi jkl     2
r3  y   mno pqr     y

我是否可以编写一个函数来根据该行中字符变量的文本子集有条件地填充单行多列中的空单元格?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是一个函数,它将数据框,更改值的列和要匹配的列作为输入。我还包括两个可选参数来捕获模式(在你的情况下def表示x和pqr表示y)。注意我遗漏了第三个模式,它将值保留为原样,假设其他一切都将保持原样。如果需要,可以修改函数以接受更多模式。

<强>功能

f1 <- function(df, cols, match_with, to_x = 'def', to_y = 'pqr'){
  df[cols] <- lapply(df[cols], function(i) 
    ifelse(grepl(to_x, match_with, fixed = TRUE), 'x', 
           ifelse(grepl(to_y, match_with, fixed = TRUE), 'y', i)))
  return(df)
}

应用

#make sure your columns are characters and NOT factors
df[] <- lapply(df, as.character)

#apply the function
f1(df, cols = c('V1', 'V3'), match_with = df$V2)
#   V1      V2 V3
#r1  x abc def  x
#r2  1 ghi jkl  2
#r3  y mno pqr  y

答案 1 :(得分:0)

dplyr解决方案,使用case_when&amp; the new .data. pronoun

library(dplyr)
r1 = c('', 'abc def', '')
r2 = c('1', 'ghi jkl', '2')
r3 = c('', 'mno pqr', '')
df = as.data.frame(rbind(r1, r2, r3), stringsAsFactors = FALSE)

df %>% 
  mutate_at(
    c("V1", "V3"), 
    funs(case_when(
      grepl("def", .data$V2) ~ "x",
      grepl("pqr", .data$V2) ~ "y",
      TRUE ~ .
    ))
  )

请注意,您需要