这是一个新手问题,但是,我发现很难理解如何正确使用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)
答案 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)))
将行更改为列,以查看每列的可用内容。