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

如何提取R中的特定数字(包括NA),r,numbers,extract,na,col,R,Numbers,Extract,Na,Col,我已经在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,4002

我已经在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'))

df假设我们需要提取每行

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

在我看来,@Akrun的解决方案是最好的也是最优雅的,但是如果你想要(或者你不喜欢正则表达式),你可以用另一种方法来寻找大于100000的数字

因此,首先将数据帧转换为数字,提取大于100000的数字,并在空的情况下添加NA

因此,它应该看起来像:

df=data.frame(应用(df,2,as.numeric))
v7=data.frame(“v7”=unlist(lapply(应用(df,1,函数(x)x[which(x>=100000)]),函数(v){v=c(v,rep(NA,1-length(v)))})
你会得到:

>v7
v7
1 343012
2 438652
3 NA
4 670934
5 302001
6 NA
可能
df%>%unite(“v7”,everythings())%%>%mutate(v7=str_extract(v7,\\d{6}”)
out <- data.frame(v7 = apply(df, 1, function(x) grep("^\\d{6}", x,
     value = TRUE)[1]))
library(dplyr)
library(stringr)
df %>%
   mutate_all(~ replace(as.character(.),
         str_detect(., "^\\d{6}$", negate = TRUE), NA)) %>% 
   transmute(v7 = coalesce(!!! .))