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

R语言中对DataFrame列分组统计up/down数量的报错求助

问题:统计DataFrame各列中"up"和"down"的出现次数

示例数据

df <- data.frame(Var1 = c("up", "down", "up", "down"),
                Var2 = c("down", "up", "down", "down"),
                Var3 = c("down", "down", "up", "up")
)
df

需求

对DataFrame的每一列分组,统计"up"和"down"的出现次数。

尝试的错误代码及报错

newdf <- lapply(df[1:3], function(x){
     group_by(.[[x]])%>%
     summarize(n = n())
  })

newdf

报错信息:

Error in group_by(.[[x]]) : object '.' not found

解决方法

错误原因

代码报错是因为lapply的匿名函数中,x已经是当前遍历的列向量,你错误使用了dplyr管道的占位符.,R无法识别这个未定义的对象。

方法1:修正lapply逻辑,输出列表结果

把列向量转成tibble后直接分组统计:

library(tidyverse)

newdf <- lapply(df, function(x){
  tibble(value = x) %>%
    group_by(value) %>%
    summarize(n = n())
})

newdf

执行后得到列表,每个元素对应原DataFrame一列的统计结果:

$Var1
# A tibble: 2 × 2
  value     n
  <chr> <int>
1 down      2
2 up        2

$Var2
# A tibble: 2 × 2
  value     n
  <chr> <int>
1 down      3
2 up        1

$Var3
# A tibble: 2 × 2
  value     n
  <chr> <int>
1 down      2
2 up        2

方法2:转长格式,输出统一DataFrame结果

如果想要合并成一个DataFrame,先把数据转为长格式再分组统计:

df %>%
  pivot_longer(everything(), names_to = "column", values_to = "value") %>%
  group_by(column, value) %>%
  summarize(n = n(), .groups = "drop")

输出结果:

# A tibble: 6 × 3
  column value     n
  <chr>  <chr> <int>
1 Var1   down      2
2 Var1   up        2
3 Var2   down      3
4 Var2   up        1
5 Var3   down      2
6 Var3   up        2

方法3:用count函数简化代码

count函数可以直接替代group_by+summarize(n=n()),写法更简洁:

列表形式结果

newdf <- lapply(df, function(x){
  tibble(value = x) %>%
    count(value)
})

统一DataFrame结果

df %>%
  pivot_longer(everything(), names_to = "column", values_to = "value") %>%
  count(column, value)

内容的提问来源于stack exchange,提问作者AlySmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:20:25