我有类似的数据。
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
是紧接在前的信息,或者,如果没有先前的信息,我需要稍后再获取这些信息。
实际上如何使用R
中的现代编程来做到这一点?根据{{3}},我正在做类似的事情。
df <- df %>% mutate(v11 = ifelse(v1 %in% "Fail", lag(),
ifelse(v1 %in% "Out", lag()),
ifelse(is.na(v1) %in% lag(), v1)))
答案 0 :(得分:2)
来自zoo
,na.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)