对于另一行的每个值,不计算某列的值的NA

时间:2018-10-12 05:28:38

标签: r dataframe missing-data

在R语言中-我可以说我有一个DF,其中有两列 Fam Prop 都是分类的,现在 Fam 具有重复的名称例如Algea,Fungi等,Prop列具有分类编号和NA。我如何获得表/输出,对于每个A值,它告诉我没有多少个值。 NA示例:

    Fam     Prop
    -------------
    Algea   one
    Fungi   two
    Algea   NA
    Algea   three
    Fungi   one
    Fungi   NA

输出

Algea 2
Fungi 2

我知道使用count函数应该是解决方案的指导,但似乎无法解决,因为Fam列具有重复值。

4 个答案:

答案 0 :(得分:1)

也许是这样。

    trade_id    ccy_pairs   notional    trade_type  value_date
0   1            AUD        1.0          buy         01012018
2   3            GBP        1.5          buy         05062018
3   4            EUR        2.0          sell        03062018
4   5            NZD        6.0          buy         07082018
5   6            NZD        7.0          buy         09082020

答案 1 :(得分:1)

四种解决方案:

基本R帧:

aggregate(DF$Prop, by=list(Fam=DF$Fam), FUN=function(a) sum(!is.na(a)))
#   Fam x
# 1   A 5
# 2   B 6
# 3   C 4

R的基数,“表”(不是框架,请参见as.data.frame(xtabs(...))以查看框架的变化形式……有点不同):

xtabs(~ Fam + is.na(Prop), data=DF)
#    is.na(Prop)
# Fam FALSE TRUE
#   A     5    1
#   B     6    1
#   C     4    3

dplyr

library(dplyr)
DF %>%
  group_by(Fam) %>%
  summarize(n = sum(!is.na(Prop)))
# # A tibble: 3 x 2
#   Fam       n
#   <fct> <int>
# 1 A         5
# 2 B         6
# 3 C         4

data.table

library(data.table)
# data.table 1.11.4  Latest news: http://r-datatable.com
# Attaching package: 'data.table'
# The following objects are masked from 'package:dplyr':
#     between, first, last
DT <- as.data.table(DF)
DT[,sum(!is.na(Prop)),keyby=.(Fam)]
#    Fam V1
# 1:   A  5
# 2:   B  6
# 3:   C  4

数据:

DF <- data.frame(Fam=sample(c('A','B','C'), size=20, replace=TRUE), Prop=sample(c('one','two','three'), size=20, replace=TRUE))
DF$Prop[sample(20,size=5)] <- NA
DF
#    Fam  Prop
# 1    B   one
# 2    B three
# 3    C  <NA>
# 4    A  <NA>
# 5    C   one
# 6    A   two
# 7    B   one
# 8    A three
# 9    B   two
# 10   C   one
# 11   C   two
# 12   B three
# 13   C  <NA>
# 14   C  <NA>
# 15   A   one
# 16   A   one
# 17   B three
# 18   A   two
# 19   C   two
# 20   B  <NA>

答案 2 :(得分:0)

dplyr种可能性:

df %>%
  add_count(Fam, miss = !is.na(Prop)) %>%
  group_by(Fam) %>%
  summarise(Non_miss = first(n[miss = TRUE]))

df %>%
  filter(!is.na(Prop)) %>%
  group_by(Fam) %>%
  tally()

df %>%
  filter(!is.na(Prop)) %>%
  group_by(Fam) %>%
  summarise(Non_miss = n())

答案 3 :(得分:0)

Base R最短(也是最快?)解决方案

let userIDList = await col.find({
                 $or: [
                      {permission: 'student'},
                      {permission: 'staff'}
                 ]},{ select : ['_id'] }).toArray();

let final = userIDList.map((v, i) => { return v._id });
console.log(final);

它使用number.of.not.NAs <- table(df$Fam[!is.na(df$Prop)]) ,但仅选择在df$Fam向量位置上没有NA的元素。然后使用您提到的df$Prop函数。

Base R常规解决方案

或者,您可以通过table将数据框拆分为数据框列表, 然后为每个数据帧计数第二列中有多少个非NA元素-通常为split-apply-combine方法。 (但是我想上面的df$Fam方法会更快)。

table