【问题标题】:How to visualize hashtags in R, and see the trends of the hashtags?如何在 R 中可视化主题标签,并查看主题标签的趋势?
【发布时间】:2021-05-09 14:56:18
【问题描述】:

我正在做趋势分析,并尝试使用条形图来可视化标签在不同年份的频率。所以我可以看到前 3 个最常见的主题标签术语,并了解这些术语的频率在这些年中是如何演变的。我有一个这样的数据集:

    terms          year
1   #A;#B;#C       2017
2   #B;#C;#D       2016
3   #C;#D;#E       2021
4   #D;#E;#F       2020
5   #E;#F;#G       2020
6   #F;#G;#H       2020
7   #G;#H;#I       2019
8   #H;#I;#J       2018
9   #I;#J;#K       2020
10  #J;#K;#L       2020

谢谢!

【问题讨论】:

  • 每年的条形图?

标签: r hashtag


【解决方案1】:

基本上,我们需要计算每年的主题标签。由于特定年份的标签是单列的,我们需要将它分成不同的列,然后我们可以将 df 转换为长 df,我们可以根据年份和标签对其进行分组以查找计数.

library(tidyverse)

structure(list(terms = c("#A;#B;#C", "#B;#C;#D", "#C;#D;#E", 
                         "#D;#E;#F", "#E;#F;#G", "#F;#G;#H", "#G;#H;#I", "#H;#I;#J", "#I;#J;#K", 
                         "#J;#K;#L"), year = c(2017, 2016, 2021, 2020, 2020, 2020, 2019, 
                                               2018, 2020, 2020)), row.names = c(NA, -10L), class = c("tbl_df", 
                                                                                                      "tbl", "data.frame")) -> df

df %>% 
   separate(terms, into = paste0("t", 1:3), sep = ";") %>% 
   pivot_longer(-year) %>% 
   group_by(year, value) %>% 
   count(value) %>% 
   ggplot(aes(x = year, y = n, fill = value, label = n)) +
   geom_col(position = position_dodge()) +
   geom_text(position = position_dodge(1))

reprex package (v0.3.0) 于 2021-02-05 创建

【讨论】:

  • 嗨,非常感谢您的回答。但是,如果我的主题标签太多,如何使其自动化,而不是一一键入?谢谢!
  • 我无法通过一一输入来理解您的意思。数据将包含所有主题标签,并且代码是完全自动化的。根据标签的数量和年份,您可能需要更改显示情节的方式,例如按年份或一组标签。
  • 我不太明白 into = paste0("t", 1:3),你能解释一下吗?谢谢!
  • 这里有 3 个标签,所以我们需要创建 3 个新列并为此提供列名。如果你不知道标签的数量,你可以在这里给出一些大的数字,没有标签的列将返回NA
  • 是的,我有很多 NA,如何从 barchat 中删除它们?在这种情况下,为什么 2020 年有 5 个值,而其他年份有 3 个?
【解决方案2】:

要为Base R 中的每一年生成一个可读性好的图表,我们可以执行以下操作:

代码

# First create a list of data.frames that we can utilize to plot

# Split by year
listdf <- split(df, df$year)

# Only choose trends and name list according to year
listdf <- lapply(listdf, "[[", 1)

# Stringsplit to obtain trends as vector for each year
listdfplot <- lapply(listdf, function(x){
  unlist(strsplit(x, ";"))
})


# Plot 
# Plot side by side
par(mfrow = c(2, 3))

# A barplot for each year 
Map(function(x, y){
  barplot(table(x), main = paste("Trends in", y), las = 2)
},
listdfplot,
names(listdfplot))

数据

df <- structure(list(terms = c("#A;#B;#C", "#B;#C;#D", "#C;#D;#E", 
                         "#D;#E;#F", "#E;#F;#G", "#F;#G;#H", "#G;#H;#I", "#H;#I;#J", "#I;#J;#K", 
                         "#J;#K;#L"), year = c(2017, 2016, 2021, 2020, 2020, 2020, 2019, 
                                               2018, 2020, 2020)), row.names = c(NA, -10L), class = c("tbl_df", 
                                                                                                      "tbl", "data.frame")) 

【讨论】:

    【解决方案3】:

    如果每个主题标签都有一年的唯一信息,您可以创建一个新的数据框。

    之后,您可以使用 geom_bar 处理数据。

    因为是新账号,所以无法上传剧情。

    library(tidyverse)
    library(data.table)
    
    #your Data:
    
    #terms          year
    #1   #A;#B;#C       2017
    #2   #B;#C;#D       2016
    #3   #C;#D;#E       2021
    #4   #D;#E;#F       2020
    #5   #E;#F;#G       2020
    #6   #F;#G;#H       2020
    #7   #G;#H;#I       2019
    #8   #H;#I;#J       2018
    #9   #I;#J;#K       2020
    #10  #J;#K;#L       2020
    
    # make a df that looks like your data:
    terms<- c("#A;#B;#C",
              "#B;#C;#D",
              "#C;#D;#E",
              "#D;#E;#F",
              "#E;#F;#G",
              "#G;#H;#I",
              "#H;#I;#J",
              "#I;#J;#K",
              "#J;#K;#L")
    
    terms<-as.data.frame(terms)
    year<-c(2017,2016,2021,2020,2020,2019,2018,2020,2020)        
    year<-as.data.frame(year)
    df<-cbind(terms,year)
    
    # read your data from what I assume is your Data frame
    terms<-c(df$terms)
    year.list<-c(df$year)
    
    loopcount<-length(terms)
    
    # make new dummys
    year<-c()
    hashtags<-c()
    
    all.years<-as.data.frame(hashtags,year)
    #split hashtags based on ";"
    hashtag.list<-str_split(terms, ";")
    

    通过这个循环,你可以创建一个新的 DF

    # make new df were every hashtags gets the information for year
    for (i in 1:loopcount){
       hashtags<-hashtag.list[[i]]
       hashtags<-as.data.frame(hashtags)
       
       year<-c()
       for(k in 1:nrow(hashtags)) {
         year[k]<- year.list[i]
       }
       year<-as.data.frame(year)
       one.year<-cbind(hashtags,year)
       
       all.years<-rbind(all.years,one.year)
     }
    
    hashtagDF<-all.years
    
    
    head(hashtagDF)
    

    然后可以使用新的 DF 来绘制您想要的内容

    或者 如果我理解你是正确的

    如果显示每年主题标签的频率,您可以创建一个新的 df 并且只包含前 3 个主题标签

    #only include the three most used hashtags per year
    
    # dummys for new df
    hashtags<-c()
    year<-c()
    Freq<-c()
    
    top.3<-as.data.frame(hashtags,year,Freq)
    
    years.in.study<-unique(hashtagDF$year)
    #i<-3
    for ( i in 1: length(years.in.study)){
      what.year<-paste(years.in.study[i])
      #subset per year
    one.subset<-subset(hashtagDF, year == what.year)
    
    
    # calculate how often a hashtag is present per year
    freq<-table(one.subset)
    frequency.per.year<-as.data.frame(freq)
    frequency.per.year<-frequency.per.year[order(-frequency.per.year[,3]), ]
    
    # only keep the 3 most occurring terms
      lenght.of.file.to.delete<-nrow(frequency.per.year)
    if (nrow(frequency.per.year) == 3){
      lenght.of.file.to.delete<-lenght.of.file.to.delete+1
      }
    frequency.per.year<-frequency.per.year[-c(4:lenght.of.file.to.delete), ]
    
    # make a df with all years
    top.3<-rbind(top.3,frequency.per.year)
    
    }
    
    top.3
    
    
    #order for year
    top.3$year<-as.character(top.3$year)
    top.3[order(top.3[,2]), ]
    
    #year should be a factor
    top.3$yearF<-as.factor(top.3$year)
    

    然后你可以绘制它

    # plot as barplot
    # with
    # the frequencies of the hashtags in different years.
    # the top 3 most frequent hashtag terms per year
    
    
    barplot<-ggplot(data=top.3, aes(x=yearF, y=Freq,fill=hashtags)) +
      geom_bar(stat="identity")+
      labs(title = "",
           subtitle = "",
           caption = "",
           x= "", 
           y= "")
    
    
    barplot
    
    
    ggsave(file="hashtag.png", barplot, width = 210, height = 297, units = "mm")
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
    • 感谢您的评论。我还不能发布图片但是我可以对代码进行更多注释...
    • 您好,谢谢!如果我有太多标签怎么办,不仅是#A #B,而且像数千个一样,在数据框中指定所有标签是非常不方便的。有没有办法让它自动化?
    • 你好,kvjing,是的,它当然可以自动化。我不知道你的数据是如何构成的......在上面的代码中,我将这些术语读作向量。文件有多大并不重要。我假设您有某种 data.frame 或矩阵?唯一的问题是该代码绝对不是针对速度进行优化,而是针对可读性进行了优化。最好的问候
    • 嗨,是的,我的主题标签就像矢量,你能帮忙清理一下你的代码吗?我有点迷路了……非常感谢!
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2011-08-05
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多