如何在同一函数中使用ifelse / lag / mutate替换值和单词?

时间:2018-08-14 00:58:57

标签: r dataframe dplyr tidyverse

我有类似的数据。

v1 <- c("Fail", 20, 30, "Out", NA, 32, 33, 10)
v2 <- c(10, NA, NA, "Out", "Fail", 34, 35, 30)
df <- data.frame(v1,v2)

我也需要转换此数据帧。因此,'words'NA是紧接在前的信息,或者,如果没有先前的信息,我需要稍后再获取这些信息。

enter image description here

实际上如何使用R中的现代编程来做到这一点?根据{{​​3}},我正在做类似的事情。

df <- df %>% mutate(v11 = ifelse(v1 %in% "Fail", lag(),
                     ifelse(v1 %in% "Out", lag()),
                     ifelse(is.na(v1) %in% lag(), v1)))

4 个答案:

答案 0 :(得分:2)

来自zoona.locf的解决方案

df[which(df=="Fail" | df=='Out')]='NA'
zoo::na.locf(zoo::na.locf(df),fromLast=T)
  v1 v2
1 20 10
2 20 10
3 30 10
4 30 10
5 30 10
6 32 34
7 33 35
8 10 30

答案 1 :(得分:2)

您可以使用tidyverse:

library(tidyverse)
df%>%
   replace(array(grepl("\\D",as.matrix(df)),dim(df)),NA)%>%
   mutate_all(~as.numeric(as.character(.x)))%>%
   fill(v1:v2,.direction ="down")%>%
   fill(v1:v2,.direction = "up")
  v1 v2
1 20 10
2 20 10
3 30 10
4 30 10
5 30 10
6 32 34
7 33 35
8 10 30

答案 2 :(得分:2)

这里是fill

的一个选项
library(tidyverse)
df %>%
     mutate_all(funs(as.numeric(as.character(.)))) %>% 
     fill(v1, v2) %>%
     fill(v1, .direction = 'up')
#   v1 v2
#1 20 10
#2 20 10
#3 30 10
#4 30 10
#5 30 10
#6 32 34
#7 33 35
#8 10 30

答案 3 :(得分:0)

首先使用read.table给出df0,然后使用na.approx将非数字字符串转换为NA。这给出一个矩阵。如果要数据框,请在结果上使用as.data.frame

library(zoo)

df0 <- read.table(text = paste(df$v1, df$v2), na.strings = c("NA", "Out", "Fail"))
na.approx(df0, method = "constant", rule = 2)

给予:

     V1 V2
[1,] 20 10
[2,] 20 10
[3,] 30 10
[4,] 30 10
[5,] 30 10
[6,] 32 34
[7,] 33 35
[8,] 10 30

如果需要,我们可以使用magrittr这样表达:

library(matrittr)
library(zoo)

df %$%
  paste(v1, v2) %>%
  read.table(text = ., na.strings = c("NA", "Out", "Fail")) %>%
  na.approx(method = "constant", rule = 2)