中间缺少值的非缺失值的级数

时间:2019-06-07 09:34:58

标签: r dplyr missing-data

继续上一个主题: Finding non-missing values between missing values

我还要查找缺失值之前的值是否小于,等于或大于缺失值之后的值。

要使用之前的相同示例,请执行以下操作:

df = structure(list(FirstYStage = c(NA, 3.2, 3.1, NA, NA, 2, 1, 3.2, 
3.1, 1, 2, 5, 2, NA, NA, NA, NA, 2, 3.1, 1), SecondYStage = c(NA, 
3.1, 3.1, NA, NA, 2, 1, 4, 3.1, 1, NA, 5, 3.1, 3.2, 2, 3.1, NA, 
2, 3.1, 1), ThirdYStage = c(NA, NA, 3.1, NA, NA, 3.2, 1, 4, NA, 
1, NA, NA, 3.2, NA, 2, 3.2, NA, NA, 2, 1), FourthYStage = c(NA, 
NA, 3.1, NA, NA, NA, 1, 4, NA, 1, NA, NA, NA, 4, 2, NA, NA, NA, 
2, 1), FifthYStage = c(NA, NA, 2, NA, NA, NA, 1, 5, NA, NA, NA, 
NA, 3.2, NA, 2, 3.2, NA, NA, 2, 1)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -20L))

行13、14和16在缺失值之间不丢失。这次的输出应为:第13、14和16行为“相同”,“较大”和“相同”,其他行为“ N / A”。

1 个答案:

答案 0 :(得分:2)

一种直接的方法是拆分,转换为数字,获取最后两个值并与ifelse语句进行比较,即

sapply(strsplit(do.call(paste, df)[c(13, 14, 16)], 'NA| '), function(i){
                                  v1 <- as.numeric(tail(i[i != ''], 2)); 
                                  ifelse(v1[1] > v1[2], 'greater', 
                                           ifelse(v1[1] == v1[2], 'same', 'smaller'))
                                   })

#[1] "same"    "smaller" "same"

注意

我已将先前的答案作为给定(do.call(paste, df)[c(13, 14, 16)]

一种更通用的方法(如罗纳克(Ronak)所述,在某些情况下,后两位数字可能会失败),

sapply(strsplit(gsub("([[:digit:]])+\\s+[NA]+\\s+([[:digit:]])", '\\1_\\2', 
                   do.call(paste, df)[c(13, 14, 16)]), ' '), function(i) { 
                                             v1 <- i[grepl('_', i)]; 
                                             v2 <- strsplit(v1, '_')[[1]]; 
                                            ifelse(v2[1] > v2[2], 'greater', 
                                               ifelse(v2[1] == v2[2], 'same', 'smaller')) })

#[1] "same"    "smaller" "same"