Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用正则表达式从字符串中提取信息_R_Regex - Fatal编程技术网

在R中使用正则表达式从字符串中提取信息

在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和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             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,且仅使用第一个元素