如何筛选DataFrame中Text列唯一观测值的最高正负情感得分记录?
解决方案
方法一:使用dplyr包(推荐,代码简洁易读)
先加载dplyr包(未安装的话先执行install.packages("dplyr")),通过分组+筛选实现需求:
library(dplyr) # 按Text分组,筛选每个组的最高正值、最低负值记录 result_df <- sentiDF %>% group_by(Text) %>% filter( # 匹配当前组的最高正值得分 sentimentscore == max(sentimentscore[sentimentscore > 0], na.rm = TRUE) | # 匹配当前组的最低负值得分 sentimentscore == min(sentimentscore[sentimentscore < 0], na.rm = TRUE) ) %>% ungroup() # 输出结果 print(result_df)
执行后得到的结果:
# A tibble: 4 × 4 Text emotion sentiment sentimentscore <chr> <chr> <chr> <dbl> 1 Text A joy positive 23 2 Text B fear negative -22 3 Text C anticipation positive 15 4 Text C fear negative -10
代码说明:
group_by(Text):将数据按Text列的唯一值分组,确保每个Text单独处理filter()中的条件:- 对有正值的组,筛选出得分最高的那条记录;无正值时,
max(..., na.rm=TRUE)返回-Inf,不会匹配任何行 - 对有负值的组,筛选出得分最低的那条记录;无负值时,
min(..., na.rm=TRUE)返回Inf,不会匹配任何行
- 对有正值的组,筛选出得分最高的那条记录;无正值时,
ungroup():取消分组,恢复普通DataFrame结构
方法二:使用Base R(无需额外包)
如果不想加载第三方包,可以用Base R的聚合+合并方法实现:
# 计算每个Text组的最高正值和最低负值 group_stats <- aggregate(sentimentscore ~ Text, data = sentiDF, function(x) { list( max_pos = if(any(x > 0)) max(x[x > 0]) else NA, min_neg = if(any(x < 0)) min(x[x < 0]) else NA ) }) # 展开统计结果为表格 group_stats <- do.call(rbind, lapply(1:nrow(group_stats), function(i) { data.frame( Text = group_stats$Text[i], max_pos = group_stats$sentimentscore[[i]]$max_pos, min_neg = group_stats$sentimentscore[[i]]$min_neg ) })) # 合并原数据并筛选目标记录 result_base <- merge(sentiDF, group_stats, by = "Text") %>% filter(sentimentscore == max_pos | sentimentscore == min_neg) %>% select(-max_pos, -min_neg) # 输出结果 print(result_base)
执行后得到的结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

