You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:45:19