需要帮助来计算R中数据框中行中非数值的比率

时间:2019-06-17 14:51:31

标签: r dataframe

所以我有一个数据集,其中每段文字都被标记为“正”,“中性”或“负”。然后,每段文本都分配一个ID。每个ID都链接到上述标记值的多行。现在,我希望能够以正/正+负+中性(总)的比率创建2个新列。和负数/总数的比率。

我想出了如何查看矩阵中每个id的标签出现频率的方法。但是我不知道如何编写一个脚本来对矩阵中的频率数进行计算。

我正在使用的数据框示例:

category_senti        artist_id
Positive              01_artist
Negative              01_artist
Positive              02_artist
Negative              02_artist
Neutral               02_artist
Negative              03_artist
Positive              03_artist
Neutral               03_artist
Negative              03_artist
Neutral               03_artist
Negative              04_artist
Positive              04_artist
.....                 .....
.....                 23_artist

到目前为止,我一直在尝试成功,因为您可以看到每个artist_id标签的出现频率。但是我需要能够使用自定义的书面函数中的频率进行计算。

data[data$artist_id == "03_artist",] %>% group_by(category_senti) %>% summarise(n=n())

# A tibble: 3 x 2
  category_senti     n
  <fct>          <int>
1 Negative          59
2 Neutral          157
3 Positive         165

我希望创建两个新的数据框: 数据$ pos_ratio和数据$ neg_ratio以及标签'Pos','Neg'出现的时间的相应比率除以每个artist_id的总数。

因此理想情况下,pos_ratio数据帧应如下所示:

artist_id   pos_ratio
01_artist   0.4764
02_artist   0.3566
03_artist   0.8472
04_artist   0.3058
05_artist   0.2056
06_artist   0.2534
.....       ......

谢谢!

2 个答案:

答案 0 :(得分:1)

我们可以按'artist_id'分组,创建带有频率计数的列'n',然后按'category_senti'分组,取频率与之前创建的频率列的比率,然后按'category_senti'除以list个data.frames

library(dplyr)
data %>% 
    group_by(artist_id) %>%
    mutate(n = n()) %>%
    group_by(category_senti, add = TRUE) %>%
    summarise(ratio = n()/n[1]) %>%
    ungroup %>%
    group_split(category_senti, keep = FALSE)

答案 1 :(得分:1)

您可以使用mean(category_senti == 'Positive')计算正值的比率,对于负数可以计算出相似的比率。

library(data.table)
setDT(df)

out <- 
  df[, .(pos_ratio = mean(category_senti == 'Positive'),
          neg_ratio = mean(category_senti == 'Negative'))
     , by = artist_id]

#    artist_id pos_ratio neg_ratio
# 1: 01_artist 0.5000000 0.5000000
# 2: 02_artist 0.3333333 0.3333333
# 3: 03_artist 0.2000000 0.4000000
# 4: 04_artist 0.5000000 0.5000000

如果要将正值或负值视为单独的数据集,则可以仅对out进行子集

out[, .(artist_id, neg_ratio)]
#    artist_id neg_ratio
# 1: 01_artist 0.5000000
# 2: 02_artist 0.3333333
# 3: 03_artist 0.4000000
# 4: 04_artist 0.5000000

使用的数据

df <- fread('
category_senti        artist_id
Positive              01_artist
Negative              01_artist
Positive              02_artist
Negative              02_artist
Neutral               02_artist
Negative              03_artist
Positive              03_artist
Neutral               03_artist
Negative              03_artist
Neutral               03_artist
Negative              04_artist
Positive              04_artist
')