gpt4 book ai didi

r - 转置 data.frame 并计算每列的非 NA 值

转载 作者:行者123 更新时间:2023-12-01 08:45:27 25 4
gpt4 key购买 nike

我有这个数据框:

set.seed(100)
x <- data.frame(KAS1_1 = sample(c(letters[1], NA), 10, replace =TRUE),
KAS1_2 = sample(c(letters[2], NA), 10, replace =TRUE),
KAS1_3 = sample(c(letters[3], NA), 10, replace =TRUE),
KAS1_4 = sample(c(letters[4], NA), 10, replace =TRUE),
KAS1_5 = sample(c(letters[5], NA), 10, replace =TRUE),
stringsAsFactors = FALSE)
> df
KAS1_1 KAS1_2 KAS1_3 KAS1_4 KAS1_5
1 a <NA> <NA> d e
2 a <NA> <NA> <NA> <NA>
3 <NA> b <NA> d <NA>
4 a b <NA> <NA> <NA>
5 a <NA> c <NA> <NA>
6 a <NA> c <NA> e
7 <NA> b <NA> d <NA>
8 a b <NA> <NA> <NA>
9 <NA> b <NA> <NA> e
10 a <NA> c d e

我正在寻找一种方法来获得这个:

   Var   Count
KAS1_1 8
KAS1_2 5
KAS1_3 3
KAS1_4 4
KAS1_5 4

我正在尝试 dplyr 使用 tablelapply()t() 没有结果.有没有更直接的方法?

最佳答案

## halfway there
colSums(!is.na(x))
# KAS1_1 KAS1_2 KAS1_3 KAS1_4 KAS1_5
# 7 5 3 4 4

## make it a data frame
data.frame(count = colSums(!is.na(x)))
# count
# KAS1_1 7
# KAS1_2 5
# KAS1_3 3
# KAS1_4 4
# KAS1_5 4

## or use `stack` like markus's nice answer:
stack(colSums(!is.na(x)))
# values ind
# 1 7 KAS1_1
# 2 5 KAS1_2
# 3 3 KAS1_3
# 4 4 KAS1_4
# 5 4 KAS1_5

将行名转换为它们自己的列将是另一个步骤,但我将把它留给你。

tidyverse 解决方案会让您转换为长格式,然后进行分组求和:

library(dplyr)
library(tidyr)
x %>% gather %>%
group_by(key) %>%
summarize(value = sum(!is.na(value)))
# # A tibble: 5 x 2
# key value
# <chr> <int>
# 1 KAS1_1 7
# 2 KAS1_2 5
# 3 KAS1_3 3
# 4 KAS1_4 4
# 5 KAS1_5 4

data.table 解决方案类似:

library(data.table)
xdt = as.data.table(x)
melt(xdt, measure.vars = names(xdt))[, .(count = sum(!is.na(value))), by = .(variable)]
# variable count
# 1: KAS1_1 7
# 2: KAS1_2 5
# 3: KAS1_3 3
# 4: KAS1_4 4
# 5: KAS1_5 4

关于r - 转置 data.frame 并计算每列的非 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55149878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com