如何提取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
我已经在 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