如何为R中的数据表做count()函数的for循环?



我需要计算每列中特定值的出现次数,然后为其执行for循环,以便为整个数据帧(由数千列组成)运行count()函数。

例如,如果我有一个包含:[0,0,0,1,1,0,0,0,0,0]的列。我希望它对列进行计数并为我返回的信息:1→2项0→10项我拥有的数据帧完全由0和1组成。我只需要计算每列中有多少个,但是那个数据框有几千列。

目前,我的for循环代码不工作,它似乎只注册第一列,并不断打印相同的第一列结果一遍又一遍。谢谢大家! !

    s <- 0
yes_filt_high_mutation <- data.frame(); 
for(c in colnames(high_mutations)[2:ncol(high_mutations)]){   #high_mutations = my dataframe
  mutation_results = high_mutations %>% count(high_mutations$c);   #Count the # of 0s and 1s in each column
  print(c) 
  print(mutation_results) 
  s <- s + 1  
  add_column <- c(c,mutation_results[1,2],mutation_results[2,2])   
  yes_filt_high_mutation <- rbind(data.frame(yes_filt_high_mutation), add_column)  
}
names(yes_filt_high_mutation)[1] <- "Samples"   
names(yes_filt_high_mutation)[2] <- "Number of 0's"
names(yes_filt_high_mutation)[3] <- "Number of 1's"

我希望我的结果是这样的,对于每个循环结果:所以实际上告诉我,在第1列中有134个0计数和2个1计数。

  high_mutations$Column1   n
1                      0 134
2                      1   2

我建议您考虑想要的最终格式。如果您的目的是在一列中获得观察值的计数,您可以通过使用tidyverse中提供的常用动词来获得。

library(tidyverse)
select(mtcars, cyl, vs, gear) %>%
  pivot_longer(cols = everything()) %>%
  group_by(name, value) %>%
  summarise(ndist = n())
#> `summarise()` has grouped output by 'name'. You can override using the
#> `.groups` argument.
#> # A tibble: 8 × 3
#> # Groups:   name [3]
#>   name  value ndist
#>   <chr> <dbl> <int>
#> 1 cyl       4    11
#> 2 cyl       6     7
#> 3 cyl       8    14
#> 4 gear      3    15
#> 5 gear      4    12
#> 6 gear      5     5
#> 7 vs        0    18
#> 8 vs        1    14

由reprex包(v2.0.1)于2022-04-16创建

<标题>
  1. 为了简单起见,通过select动词将一组列简化为仅包括vs, cylgear
  2. 数据转换为长格式,以便通过pivot_longer更容易通过tidyr进行分组
  3. 关键是计算每个组合的出现次数,如果我理解了你的要求,这就是你的目标。在本例中,对于cyl列我们得到11实例值为4 7实例值为6等等

可选

  1. 您可以使用pivot_wider将该数据转换为宽格式,但我不会急于这样做,因为格式良好的长数据通常更容易使用

广泛的言论
  • 在数据帧中循环列通常是不可取的做法。R提供了许多优化的、健壮的、成熟的方法来实现类似的目标。基础R中可用的apply函数或通过tidyverse提供的across谓词都是很好的起点
  • 您可能希望对您的要求进行改进。正如在评论中观察到的那样,您实际上是在寻找类似于table(mtcars$cyl)的输出加上一些额外的修饰吗?

替代解决方案如果您不太在意输出格式,您也可以利用map

library(tidyverse)
select(mtcars, cyl, vs, gear) %>%
  map(~ table(.x))
#> $cyl
#> .x
#>  4  6  8 
#> 11  7 14 
#> 
#> $vs
#> .x
#>  0  1 
#> 18 14 
#> 
#> $gear
#> .x
#>  3  4  5 
#> 15 12  5

由reprex包(v2.0.1)于2022-04-16创建

你会得到相同的结果,但作为一个列表,你可能希望把它们打包在一个数据帧中,但如果你打算这样做,留在group_by可能是一个更直接的。

最新更新