【问题标题】:Count no-NA values per row每行计算 no-NA 值
【发布时间】:2017-07-26 08:45:09
【问题描述】:
family_id<-c(1,2,3)
age_mother<-c(30,27,29)
dob_child1<-c("1998-11-12","1999-12-12","1996-04-12")##child one birth day
dob_child2<-c(NA,"1997-09-09",NA)##if no child,NA
dob_child3<-c(NA,"1999-09-01","1996-09-09")
DT<-data.table(family_id,age_mother,dob_child1,dob_child2,dob_child3)

现在我有了 DT,我如何使用这个表来知道每个家庭有多少孩子,使用如下语法:

DT[,apply..,keyby=family_id]##this code is wrong

【问题讨论】:

  • 可以DT[, 3 - Reduce("+", lapply(.SD, is.na)), .SDcols = dob_child1:dob_child3] 或DT[, rowSums(!is.na(.SD)), .SDcols = dob_child1:dob_child3]
  • 删除 dob_child3 中 NA 上的引号,如果没有被识别为日期并计数
  • 你也可以融算:melt(DT, measure.vars = patterns("^dob_child"))[!is.na(value), .(kids = .N), by= family_id]
  • @DavidArenburg 非常感谢。你的回答真的是我想要的。这是一个直接的解决方案。我对 DT[, .(family_id,rowSums(!is.na(.SD))),.SDcols = dob_child1:dob_child3] 做了一些更改
  • @docendodiscimus 谢谢。你的回答很有启发性。

标签: r data.table


【解决方案1】:

这也可能有效:

> DT$total_child <- as.vector(rowSums(!is.na(DT[, c("dob_child1", 
"dob_child2", "dob_child3")])))
> DT
  family_id age_mother dob_child1 dob_child2 dob_child3 total_child
1         1         30 1998-11-12       <NA>       <NA>           1
2         2         27 1999-12-12 1997-09-09 1999-09-01           3
3         3         29 1996-04-12       <NA> 1996-09-09           2

【讨论】:

    【解决方案2】:

    您可以使用sqldf 包,在R 中使用SQL 查询。

    我复制了你的 DT。

    family_id<-c(1,2,3)
    age_mother<-c(30,27,29)
    dob_child1<-c("1998-11-12","1999-12-12","1996-04-12")##child one birth day
    dob_child2<-c(NA,"1997-09-09",NA)##if no child,NA
    dob_child3<-c(NA,"1999-09-01","1996-09-09")
    DT<-data.table(family_id,age_mother,dob_child1,dob_child2,dob_child3)
    
    library(sqldf)
    
    sqldf('select distinct (count(dob_child3)+count(dob_child2)+count(dob_child1)) as total_child,
           family_id from DT group by family_id')
    

    结果如下:

      total_child family_id
    1           1         1
    2           3         2
    3           2         3
    

    这对你来说是正确的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 2019-08-04
      • 2021-09-05
      • 2022-07-15
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多