我想用值Z来计算元素的数量。
我将举例说明我需要的东西。
我有大量的标签(数百万)存储在数据框中,它们的格式为< X>。
如下图所示。我需要获取每个标签的数量以找到前10个标签(最常提到的标签)。
示例:
我需要的输出是:
注意:我是R的初学者,所以我需要最简单的方法。
我的尝试:我尝试了函数表(),但看起来它适用于数字。 我尝试了group_by(),但我没有得到想要的结果。 数据集样本:
DF <- data.frame(Tag=c("<C++><Java>","<java><python><javascript>","<java><C++>","<Json><PHP>","<PHP><Java>"))
Tag
1 <C++><Java>
2 <java><python><javascript>
3 <java><C++>
4 <Json><PHP>
5 <PHP><Java>
答案 0 :(得分:2)
使用stringi
,dplyr
和tidytext
包,您可以执行以下操作。您可以使用stri_extract_all_regex()
提取计算机语言名称并拆分每个字符串并使用unnest_tokens()
创建数据框。然后,计算每种语言出现在数据集中的次数。
DF %>%
unnest_tokens(input = Tag, output = language, token = stri_extract_all_regex,
pattern = "(?<=\\<)[^<>]*(?=\\>)", to_lower = TRUE) %>%
count(language, sort = TRUE)
language n
<chr> <int>
1 java 4
2 c++ 2
3 php 2
4 javascript 1
5 json 1
6 python 1
答案 1 :(得分:1)
这是基础R的解决方案;在我看来,在这种情况下不需要额外的库。
table(unlist(strsplit(gsub("(^<|>$)", "", DF$Tag), "><")));
# C++ java Java javascript Json PHP python
# 2 2 2 1 1 2 1
或者如果您想忽略大小写,您可以将所有标记转换为小写:
table(tolower(unlist(strsplit(gsub("(^<|>$)", "", DF$Tag), "><"))));
# c++ java javascript json php python
# 2 4 1 1 2 1
作为data.frame
as.data.frame(table(tolower(unlist(strsplit(gsub("(^<|>$)", "", DF$Tag), "><")))))
# Var1 Freq
#1 c++ 2
#2 java 4
#3 javascript 1
#4 json 1
#5 php 2
#6 python 1
说明:分别从开头和结尾删除"<"
和">"
; strsplit
上"><"
,并使用table
计算出现次数。
答案 2 :(得分:1)
library(tidyverse)
library(tidytext)
DF%>%mutate(Freq=1)%>%
unnest_tokens(Tag,Tag,"regex",pattern="<|>|\\n")%>%group_by(Tag)%>%
summarise(count=n())%>%arrange(desc(count))
# A tibble: 6 x 2
Tag count
<chr> <int>
1 java 4
2 c++ 2
3 php 2
4 javascript 1
5 json 1
6 python 1
在基础R中执行此操作:
您需要split
,然后trim
空格和表格,并按降序排序
sort(table(trimws(unlist(strsplit(gsub("<(.*?)>(R?)","\\U\\1 ",DF$Tag,perl = T)," ")))),T)
JAVA C++ PHP JAVASCRIPT JSON PYTHON
4 2 2 1 1 1