如何提取R中的特定数字(包括NA)

how to extract specific digits in R (including NA)

我已经在 R 中成功地从 dataframe 中提取了特定值。但是,还有另一个问题我无法解决。如果有任何帮助,我们将不胜感激。

原始数据如下所示: 我想从每一行中提取 6 位数字,但框架中有一些行。它看起来像这样:

df <- data.frame(
  v1=c('aa',438652,22,01,54,5892),
  v2=c(343012,45,'pi',75,2001,3),
  v3=c(56,'hi',78,670934,77,90),
  v4=c('cc','go',35,4458,40021,576),
  v5=c('ya',435,05,44,90032,6021),
  v6=c(432,21,3013,5,302001,'fgh'))

然而,

我想将“6 位数字”提取到另一个新框架中,也包含在 "NA"

看起来像这样:

new <- data.frame(
  v7=c(343012,438652,NA,670934,302001,NA))

有人有什么想法吗?将不胜感激!!

假设我们需要每行提取

out <- data.frame(v7 = apply(df, 1, function(x) grep("^\d{6}", x,
     value = TRUE)[1]))

另一个选项是 coalesce 将除 6 位以外的所有值替换为 NA

library(dplyr)
library(stringr)
df %>%
   mutate_all(~ replace(as.character(.),
         str_detect(., "^\d{6}$", negate = TRUE), NA)) %>% 
   transmute(v7 = coalesce(!!! .))

在我看来,@Akrun 的解决方案是最好和最优雅的解决方案,但如果您愿意(或者您不喜欢正则表达式),您可以通过寻找大于 100000 的数字来换一种方式。

所以,首先将dataframe转换为数字,提取大于100000的数字,在空的情况下添加NA。

所以,它应该是这样的:

df = data.frame(apply(df,2,as.numeric))
v7 = data.frame("v7" = unlist(lapply(apply(df,1,function(x) x[which(x>=100000)]), function(v){v = c(v,rep(NA,1-length(v)))})))

你得到:

> v7
      v7
1 343012
2 438652
3     NA
4 670934
5 302001
6     NA