我需要计算每列中特定值的出现次数,然后为其执行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创建
<标题>- 为了简单起见,通过
select
动词将一组列简化为仅包括vs
,cyl
和gear
。 - 数据转换为长格式,以便通过
pivot_longer
更容易通过tidyr
进行分组 - 关键是计算每个组合的出现次数,如果我理解了你的要求,这就是你的目标。在本例中,对于
cyl
列我们得到11
实例值为4
7
实例值为6
等等
可选
- 您可以使用
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
apply
函数或通过tidyverse
提供的across
谓词都是很好的起点table(mtcars$cyl)
的输出加上一些额外的修饰吗?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
可能是一个更直接的。