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
相关产品推荐
相关产品推荐

