2017-03-04 46 views
0

我有一個包含缺失值的數據框。這些缺失的值跨越多個變量,但是在所述變量中出現,一次出現在特定觀察值上。例如,我的數據幀看起來像:根據字符串的子集有條件地填充缺失值

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

我想在所有情況下,「X」,填補雙雙失蹤值,其中DF $ V2包含「高清」,請在兩個缺失值與「Y」 df $ V2包含'pqr'的所有情況,並且保留df $ V2包含'jkl'的所有行。換句話說,我想用一個數據幀,看起來像落得:

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

我可以寫一個函數基於文本的一個子集有條件填補空白單元格在一行中的多個列該行中的字符變量的值?非常感謝您的幫助。

回答

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 
0

dplyr解決方案,使用case_when & 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 ~ . 
    )) 
) 

請注意,您需要將開發版本dplyr關閉GH才能做到這一點。