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

R 如何在同一函数中使用ifelse/lag/mutate替换值和字?,r,dataframe,dplyr,tidyverse,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) 来自na.locf动物园的解决方案 来自na.locf动物园的解决方案 您可以使用tidyverse: library(tidyverse) df%>% replace(array(grepl("\\D",as.ma

我有类似的数据

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)
来自na.locf动物园的解决方案

来自na.locf动物园的解决方案

您可以使用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
您可以使用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
这里有一个填充选项

这里有一个填充选项


首先使用read.table(给出df0)将非数字字符串转换为NA,然后使用NA.approx。这给出了一个矩阵。如果需要数据帧,请在结果上使用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)
如果需要,我们可以使用magrittr这样表示:

library(matrittr)
library(zoo)

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

首先使用read.table(给出df0)将非数字字符串转换为NA,然后使用NA.approx。这给出了一个矩阵。如果需要数据帧,请在结果上使用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)
如果需要,我们可以使用magrittr这样表示:

library(matrittr)
library(zoo)

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

为什么NA的v1[5]变成了32而不是30?对不起,我编辑了。可能是@MikeH的重复。这似乎是,但它不是100%相同。即使在这里,也出现了好的和新的答案。甚至在df上也有文字。为什么v1[5]即NA变为32而不是30?对不起,我编辑了。可能是@MikeH的重复。这似乎是,但它不是100%相同。即使在这里,也出现了好的和新的答案。甚至在df上也有文字。
library(matrittr)
library(zoo)

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