使用data.table

时间:2017-04-07 07:24:44

标签: r dataframe data.table aggregate na

我有一个data.framecharacter列和几个包含NA的数字列。

以下是一些示例行:

df <- data.frame(id=rep("A",3),v1=c(NA,1,NA),v2=c(2,5,2),v3=c(NA,NA,NA),V4=c(0,0,0),stringsAsFactors=F)

df$id重复后,我想aggregate df df$idsumrequire(data.table) setDT(df)[,lapply(.SD, function(x) sum(x,na.rm=T)),by=.(id)] 应用于所有其他列。

我这样做了:

   id v1 v2 v3 V4
1:  A  1  9  0  0

我得到了这个:

v3

因此,NAdf0 NA,因此获得NA的值,这对我来说是个问题,因为在这种情况下我希望保留NA值,但在所有其他情况下(汇总是数字和NA的混合,显然我想要删除df$v4,否则总和将为0)。如示例所示(0),我的列都是NA,因此我无法用data.frame&替换所有 id v1 v2 v3 V4 1: A 1 9 NA 0 & #39;来自汇总的data.table

换句话说,这是我期望的结果:

.SD

知道如何获得<?php $array1=Array ( 0 => Array ( "id" => 377556, "name" => "8 Ball Pool iOS App - US *" ) ); $array2=Array ( 0 => Array ( "id" => 377555, "name" => "test data" ) ); $newArray=array($array1,$array2); $result=array(); foreach($newArray as $value) { $result=array_merge($result,$value); } print_r($result); Array ( [0] => Array ( [id] => 377556 [name] => 8 Ball Pool iOS App - US * ) [1] => Array ( [id] => 377555 [name] => test data ) ) 聚合来实现这一目标吗?

2 个答案:

答案 0 :(得分:5)

df[,lapply(.SD, function(x) ifelse(all(is.na(x)),NA,sum(x,na.rm=T))),by=.(id)]
id v1 v2 v3 V4
1:  A  1  9 NA  0

答案 1 :(得分:1)

我们也可以在没有if/else声明的情况下执行此操作

setDT(df)[, lapply(.SD, function(x) sum(x, na.rm = TRUE)*NA^all(is.na(x))), id]
#   id v1 v2 v3 V4
#1:  A  1  9 NA  0