在R中使用正则表达式从字符串中提取信息
我有这样的数据,我想从x和y中提取一些信息在R中使用正则表达式从字符串中提取信息,r,regex,R,Regex,我有这样的数据,我想从x和y中提取一些信息 x= "{\"device_codename\": \"nikel\", \"brand\": \"Xiaomi\"}" y= {"percent_incoming_nighttime": 0.88, "percent_outgoing_daytime": 9.29} 结果 device_codename brand percent_incoming_nighttime percent_outgoing_daytime nikel
x= "{\"device_codename\": \"nikel\", \"brand\": \"Xiaomi\"}"
y= {"percent_incoming_nighttime": 0.88, "percent_outgoing_daytime": 9.29}
结果
device_codename brand percent_incoming_nighttime percent_outgoing_daytime
nikel Xiaomi 0.88 9.29
我已经厌倦了使用grep,但是我收到了一些错误,有什么建议吗
grep("device_codename", x, perl=TRUE, value=TRUE)
删除大括号({}
)和带有gsub
的双引号后,使用read.csv
将后面的子字符串读入数据框
,然后用子字符串更改列名,即在前面:
v1 <- gsub('"|[{}]', "", c(x, y))
out <- read.csv(text=paste(gsub("\\w+:\\s+", "", v1), collapse=", "),
header=FALSE, stringsAsFactors = FALSE)
colnames(out) <- unlist(regmatches(v1, gregexpr("\\w+(?=:)", v1, perl = TRUE)))
out
# device_codename brand percent_incoming_nighttime percent_outgoing_daytime
#1 nikel Xiaomi 0.88 9.29
数据
x在移除大括号({}
)和带有gsub
的双引号后,使用read.csv
将后面的子字符串读取到data.frame
中,然后使用子字符串更改列名,即前面的列名:
v1 <- gsub('"|[{}]', "", c(x, y))
out <- read.csv(text=paste(gsub("\\w+:\\s+", "", v1), collapse=", "),
header=FALSE, stringsAsFactors = FALSE)
colnames(out) <- unlist(regmatches(v1, gregexpr("\\w+(?=:)", v1, perl = TRUE)))
out
# device_codename brand percent_incoming_nighttime percent_outgoing_daytime
#1 nikel Xiaomi 0.88 9.29
数据
x这可能是JSON格式。有一些工具可以处理这些问题
library(jsonlite)
x = "{\"device_codename\": \"nikel\", \"brand\": \"Xiaomi\"}"
y = '{"percent_incoming_nighttime": 0.88, "percent_outgoing_daytime": 9.29}'
> unlist(fromJSON(x))
device_codename brand
"nikel" "Xiaomi"
> unlist(fromJSON(y))
percent_incoming_nighttime percent_outgoing_daytime
0.88 9.29
这可能是JSON格式。有一些工具可以处理这些问题
library(jsonlite)
x = "{\"device_codename\": \"nikel\", \"brand\": \"Xiaomi\"}"
y = '{"percent_incoming_nighttime": 0.88, "percent_outgoing_daytime": 9.29}'
> unlist(fromJSON(x))
device_codename brand
"nikel" "Xiaomi"
> unlist(fromJSON(y))
percent_incoming_nighttime percent_outgoing_daytime
0.88 9.29
完成的jsonlite解决方案(Roman Luštrik)
结果
myrow brand device_codename percent_incoming_nighttime percent_outgoing_daytime
1 1 Xiaomi nikel 0.88 9.29
完成的jsonlite解决方案(Roman Luštrik)
结果
myrow brand device_codename percent_incoming_nighttime percent_outgoing_daytime
1 1 Xiaomi nikel 0.88 9.29
谢谢你的回答。当我试着跑完最后一行时。colnames(out)在表达式后表示预期的'。你能检查一下吗?@Hanihlayle对不起,末尾缺少一个括号。修正了它仍然有一个错误bcoz开放括号的数量是3。所以,我在最后加了一个。但当我运行它时,没有输出?@Hanihlayle现在,它对我来说工作正常。你能在我的帖子中用同样的例子再次检查一下吗?这很好,但是当我在整个数据帧上运行它时,我得到了以下错误:警告消息:1:in if(is.na(encoding))return(0L):条件的长度>1,只有第一个元素将被使用2:in if(is.na(i)){:条件的长度大于1,只有第一个元素将被使用3:In if(is.na(encoding))return(0L):条件的长度大于1,只有第一个元素将被使用4:In if(is.na(i)){:条件的长度大于1,只有第一个元素将被使用谢谢你的回答。当我尝试运行最后一行时。colnames(外)表达式后显示应为“,”。请检查它。@Haniihlayle抱歉,结尾缺少一个括号。已修复此问题。仍然存在一个错误,因为开放括号的数量为3。因此,我在结尾添加了另一个括号。但当我运行它时,没有输出?@Hanihlayle现在,它对我来说工作正常。您能与在我的postThat中的相同示例很好,但是当我在整个数据帧上运行它时,我得到了以下错误:警告消息:1:in if(is.na(encoding))return(0L):条件的长度大于1,只有第一个元素将被使用2:in if(is.na(i)){:条件的长度大于1,只有第一个元素将被使用3:in if(is.na(encoding))return(0L):条件的长度大于1,并且只有第一个元素将被使用4:In if(is.na(i)){:条件的长度大于1,并且只有第一个元素将被使用,这非常好。但是当我在多行中运行时,我收到了以下错误警告消息:1:In if(is.na(encoding))return(0L):条件的长度>1,并且只有第一个元素将被使用2:In if(is.na(i)){:条件的长度>1,并且只有第一个元素将被使用,这非常好。但是当我在多行中运行时,我收到了以下错误警告消息:1:In if(is.na(encoding))返回(0L):条件的长度>1,且仅使用第一个元素2:In if(is.na(i)){:条件的长度>1,且仅使用第一个元素