我的data.table是这样的。
data <- data.frame(a = c(NA, "2019-08-02", NA, "243", "N"),
b = c(NA, NA, "2", "2019-02-01", "MA"),
c = c("2019-12-02", NA, "2019-11-22", NA, "2019-01-30"))
我需要的值包含在不同的行和列中。那么,我想要什么呢?我需要创建一个新的列,比包含我需要的值。
1 2019-08-02 NA NA 242
2 2019-02-01 M 342 NA
3 2019-02-01 M 342 NA
4 2019-02-01 M 342 NA
5 2019-02-01 M 342 NA
我尝试使用 mutate_all
但这个函数不能与简单的突变一起使用!
data1 <- data %>%
mutate(new = mutate_all(., ~grepl("2019", .)))
如果你只想把日期放在一列中,这也是可行的(假设你每行只有一个日期)。
library(stringr)
f <- apply(data, 1, function(x) paste(x, collapse = " "))
data$new <- str_extract(f, "\\d{4}-\\d{2}-\\d{2}")
data
a b c new
1 <NA> <NA> 2019-12-02 2019-12-02
2 2019-08-02 <NA> <NA> 2019-08-02
3 <NA> 2 2019-11-22 2019-11-22
4 243 2019-02-01 <NA> 2019-02-01
5 N MA 2019-01-30 2019-01-30
在 tidyverse
是将其改成 "长 "格式。filter
的行数 Date
格式化并将该列绑定到原始数据集上
library(dplyr)
library(tidyr)
library(stringr)
data %>%
pivot_longer(cols = everything(), values_drop_na = TRUE, values_to = 'new') %>%
select(new) %>%
filter(str_detect(new, "^\\d{4}-\\d{2}-\\d{2}$")) %>%
bind_cols(data, .)
# A tibble: 5 x 4
# a b c new
# <fct> <fct> <fct> <fct>
#1 <NA> <NA> 2019-12-02 2019-12-02
#2 2019-08-02 <NA> <NA> 2019-08-02
#3 <NA> 2 2019-11-22 2019-11-22
#4 243 2019-02-01 <NA> 2019-02-01
#5 N MA 2019-01-30 2019-01-30
或者另一种选择是将非Date元素改为 NA
并使用 coalesce
data %>%
mutate_all(~ as.character(replace(., !str_detect(., '^\\d{4}-\\d{2}-\\d{2}$'), NA))) %>%
transmute(new = coalesce(!!! .)) %>%
bind_cols(data, .)
# a b c new
#1 <NA> <NA> 2019-12-02 2019-12-02
#2 2019-08-02 <NA> <NA> 2019-08-02
#3 <NA> 2 2019-11-22 2019-11-22
#4 243 2019-02-01 <NA> 2019-02-01
#5 N MA 2019-01-30 2019-01-30