使用lapply的数据集摘要

时间:2016-07-08 05:57:31

标签: r lapply summarization

这是一个新手问题,但是,我发现很难理解如何正确使用lapply,尤其是当使用的ID不是数字时。

尝试查找我想到的摘要可能有更好的方法,但就目前而言,我正试图使用​​lapply。基本上,我有一个17列的大型df。其中两列是ID和Date。并非所有ID都在给定列名中具有记录值。我感兴趣的是找到每列可用的总行数,以及该列存在的唯一ID数。我有一个让事情更清晰的输入示例。例如,Var8只有6行可用数据,因此它有6个唯一ID。此外,Var15有20行和12个唯一ID。但我想知道所有Var15。我可以使用

手动执行此操作
after_save :unique_attribute_on_child

def unique_attribute_on_child
  attribute_list = self.childs.pluck(:attribute) 
    if attribute_list.uniq.length != attribute_list.length
      self.childs.each { |c| c.update_attributes(attribute:nil) }
      errors[:base] << "Parent contains Child(s) with same Attribute"
    end
  end
end

但是试图自动化:

export class AppComponent {
   constructor(){
       //block of statements
   }  
   ngOnInit(){

   }   
}

给我一​​个错误:尝试应用非功能。

Var8=df[!(is.na(df$Var8)),]
length(df$ID)
length(unique(df$ID)) 
remove(Var8)

4 个答案:

答案 0 :(得分:2)

我建议让自己熟悉使用dplyr的数据争论。实施的magrittr管道%>%将帮助您了解apply的用法。

以下是我将如何更改您的功能:

library(dplyr)
tmp<-lapply(COL.NAMES, function(x) df[,c("ID", x)] %>% na.omit) # loop and extract 15 data.frames, each with 2 columns; remove rows with missing value
rows <- sapply(tmp, nrow) 
num_comp <- lapply(tmp, '[[', "ID") %>% lapply(., unique) %>% sapply(., length) #extract only ID column from list of 15 data.frame; loop across each vector to retain unique values; count length of vector.

答案 1 :(得分:2)

另一种方法是,

df1 <- data.frame(n_rows = colSums(!is.na(df[,-(1:2)]), na.rm = TRUE), 
                  unique_IDs = sapply(df[,-2], function(i) length(unique(df$ID[!is.na(i)])))[-1])
head(df1)
#     n_rows unique_IDs
#Var1     20         12
#Var2      5          5
#Var3     16         12
#Var4     16         12
#Var5     16         12
#Var6     16         12

答案 2 :(得分:1)

我不确定我是否理解正确,但这可能是您的解决方案。 x是您的数据框

try1 <-  function(df){
  temp <- sum(!is.na(df)) ## no of non na entries 
  temp2 <- length(unique(df)) # length unique entries `
  temp <- list("x"=temp,"y"=temp2)
  temp

}

> lapply(x,try1)

这是一个data.table soln

library(data.table)
dd <- as.data.table(x)

COL.NAMES<-c("Var1","Var2","Var3","Var4","Var5","Var6","Var7","Var8","Var9","Var10","Var11","Var12","Var13","Var14","Var15")

dd[,lapply(.SD, try1),.SDcols=COL.NAMES]

答案 3 :(得分:1)

但是,我没有使用lapply,这个解决方案确实有用

find.uniques<- function(df){
for(i in 1:ncol(df)){   
    uniques<- data.frame()
    uniques[i,1]<- length(!is.na(unique(df[,i])))
    uniques[i,2]<- length(which(!is.na(unique(df[,i]))))
 }
return(uniques)
}

结果是data.frame,其中V1表示可用行数,V2表示每列有多少个ID。 您还可以return(as.data.frame(t(uniques)))将行更改为列,以查看每列的可用内容。