2012-08-17 74 views
1

我在按名称引用数据框中的列时遇到问题。我已经开始提取没有NA的行的功能:引用R数据框中的列

prepare <- function(dataframe, attr1,attr2){ 
subset_na_still_there <- dataframe[!is.na(attr1) & !is.na(attr2),] 
subset_na_still_there2 <- subset(dataframe, !is.na(attr1) & !is.na(attr2)) 
### someother code goes here 
} 

但是,返回的子集仍然包含NA。我没有得到任何错误。 这里是一个related question

编辑: 选择列,然后按编号引用它们开了窍:

prepare <- function(dataframe, attr1,attr2){ 
subset_cols <- dataframe[,c(attr1, attr2)] 
subset_gone <- subset_cols[!is.na(subset_cols[,1]) & !is.na(subset_cols[,2]),] 
} 

为什么第一个版本不会达到预期效果?

回答

3

如何:

prepare <- function(x, attr1, attr2){ 
    x[!is.na(x[attr1]) & !is.na(x[attr2]),] 
} 
+0

是的,这是它! – Ivana 2012-08-17 11:39:37

1

而不是创建自己的功能,尝试subset

subset(mydata, !is.na(attr1) & !is.na(attr2)) 

如果你想获得与港定居在摆脱行的任何领域尝试

na.omit(mydata) 
+0

我使用的是在第二行的子功能,问题不在于is.na(),但与列引用。 – Ivana 2012-08-17 10:02:45

1
df <- data.frame(att1=c(1,NA,NA,10),att2=c(NA,1,2,3),val=c("a","z","e","r")) 

df 
    att1 att2 val 
1 1 NA a 
2 NA 1 z 
3 NA 2 e 
4 10 3 r 

test <- function(df,att1,att2){ 
df_no_na <- df[!is.na(att1) & !is.na(att2),] 
df_no_na 
} 

test(df,df$att1,df$att2) 
    att1 att2 val 
4 10 3 r 

这是工作我。你确定NA吗?是is.na(df$att1)还是TRUE

+0

我怀疑OP可能一直在尝试调用函数prepare(mydf,“att1”,“att2”)'。只是猜测! – seancarmody 2012-08-17 10:02:48

+0

是的,我承认。但我得到一个“对象”att2'未找到“如果我不。我希望传递一个名字,而不是一个专栏。 – Ivana 2012-08-17 10:09:35

+0

作为一个旁注,如果我要传递一个引用属性而不是属性的名称,是否有任何名称来获取函数内部的名称? plotHist < - 函数(属性){hist(属性,主=猫(属性))} – Ivana 2012-09-10 11:42:09