R中dplyr包中变异函数的怪异行为
我正在制作一套具有尺寸的产品R中dplyr包中变异函数的怪异行为,r,dplyr,stringi,mutated,R,Dplyr,Stringi,Mutated,我正在制作一套具有尺寸的产品 dim(data) [1] 419612 2 其中第二列大致如下所示: > unique(data[1:50,"topics"]) [1] {"dom":2.0,"moda":3.0,"rodzina":1.55,"praca":1.42,"finanse":1.96,"edukacja":1.67,"sport":1.96,"muzyka":1.52,"kuchnia":1.8,"plotka":1.8,"zdrowie":1.12,"kibic
dim(data)
[1] 419612 2
其中第二列大致如下所示:
> unique(data[1:50,"topics"])
[1] {"dom":2.0,"moda":3.0,"rodzina":1.55,"praca":1.42,"finanse":1.96,"edukacja":1.67,"sport":1.96,"muzyka":1.52,"kuchnia":1.8,"plotka":1.8,"zdrowie":1.12,"kibic":1.8,"uroda":2.32,"gra":2.94,"motoryzacja":1.33,"kultura":1.42,"film":3.14,"podróż":1.9,"technologia":1.31}
[2] {"rodzina":2.99,"kultura":4.46,"muzyka":4.5}
[3] {"dom":1.93,"rodzina":5.37,"zwierzęta":3.0,"praca":4.3,"finanse":2.11,"sport":2.1,"muzyka":2.99,"nieruchomość":2.8,"kuchnia":6.4,"plotka":2.1,"zdrowie":3.79,"gra":4.25,"motoryzacja":2.57,"kultura":3.13,"film":4.4,"podróż":3.21}
[4] {"plotka":9.5,"uroda":10.06,"kultura":15.67,"muzyka":29.97}
[5] {"dom":2.99,"rodzina":2.5,"edukacja":3.85,"sport":1.17,"muzyka":1.23,"nieruchomość":2.95,"kuchnia":1.42,"wnętrze":1.33,"kibic":1.17,"ogród":1.33,"motoryzacja":1.17,"film":1.17,"podróż":1.57}
[6] {"kuchnia":4.38,"plotka":1.33,"rodzina":1.61,"film":1.33}
37530 Levels: {"biznes":1.0} ... {"zwierzęta":9.96,"podróż":9.97}
对于每一行,我想从主题列中选择在:
符号之后得分最高的单词。我试图使用dplyr
包中的mutate函数,但它似乎不起作用。使用stringi
软件包生成的字符上的操作,这些软件包是stringr
的更快版本。下面是我的代码和此操作的结果。有人知道为什么我在每次操作后都会得到相同的值,以及如何在不使用for
循环的情况下获得所需的结果吗
> data2 <- data %>%
+ mutate( xx = topics %>%
+ stri_extract_all_regex(pattern = "[a-zA-Z0-9óśćłźżęą\\.\\s]+") %>%
+ unlist %>%
+ data.frame( topic = .[seq(1,length(.), by=2)],
+ waga = .[seq(2,length(.), by=2)] ) %>%
+ select( topic, waga) %>% arrange( desc( waga)) %>%
+ unique() %>%
+ .[1,1]
+ )
> table(data2$xx)[ which(table(data2$xx) > 1) ]
kuchnia
419612
样本数据
图书馆(档案管理员)
数据您的mutate()
函数未“矢量化”。Mutate不会一次对一行进行操作,它会将整个列作为向量进行操作。您的unlist
和[1,1]
提取将获取所有行的值,并向下折叠为一个向量和一个值
您可以使用
extr <- Vectorize(. %>%
stri_extract_all_regex(pattern = "[a-zA-Z0-9óśćłźżęą\\.\\s]+") %>%
unlist %>%
data.frame( topic = .[seq(1,length(.), by=2)],
waga = .[seq(2,length(.), by=2)] ) %>%
select( topic, waga) %>% arrange( desc( waga)) %>%
unique() %>%
.[1,1])
尽管我同意其他人的看法,因为您有JSON数据,所以最好使用JSON解析器正确解析这些数据,而不是尝试用正则表达式重新发明轮子。为什么您要使用正则表达式而不是将其作为JSON来读。。?您还检查了问题是否不是数据保存为因子而不是字符(为什么在这里是因子?)?顺便问一下,您能提供示例数据吗?@Tim我已经在最后用示例数据更新了我的评论。@Tim现在我看到将fromJSON
函数fromrjson
包应用到每一行可能更可读,但正如您所看到的,简单的正则表达式也可以工作:)但是mutate
函数不行..是的,但我仍然会坚持使用其中一个JSON库,因为(a)它们是为这样的数据结构设计的,因此可能不太容易出错,(b)可能比使用正则表达式更快。如果性能是你的项目中的一个问题,我会检查它。
library(archivist)
data <- loadFromGithubRepo( "97f74c5a10f510cce39eafb0d9a1a9e8",
user="MarcinKosinski", repo="Museum", value = TRUE )
extr <- Vectorize(. %>%
stri_extract_all_regex(pattern = "[a-zA-Z0-9óśćłźżęą\\.\\s]+") %>%
unlist %>%
data.frame( topic = .[seq(1,length(.), by=2)],
waga = .[seq(2,length(.), by=2)] ) %>%
select( topic, waga) %>% arrange( desc( waga)) %>%
unique() %>%
.[1,1])
data %>% mutate( xx = extr(topics))