使用get函数删除数据框中的行

时间:2013-05-29 04:37:14

标签: r dataframe

假设我有以下数据框:

mydataframe <- data.frame(ID=c(1,2,NA,4,5,NA),score=11:16)

我希望最后得到以下数据框:

mydataframe[-which(is.na(mydataframe$ID)),]

我需要对许多其他数据框进行这种清理(和其他类似的操作)。所以,我决定为mydataframe和感兴趣的变量指定一个名称。

dbname <- "mydataframe"
varname <- "ID"
attach(get(dbname))

我在下一行中收到错误,这是可以理解的。

get(dbname) <- get(dbname)[-which(is.na(get(varname))),]
detach(get(dbname))

我该如何解决这个问题? (我不想分配给新的数据框,即使它现在似乎只是解决方案。之后我会多次使用“dbname”。) 提前谢谢。

4 个答案:

答案 0 :(得分:4)

没有get<-函数,并且没有get(colname)函数(因为colnames不是第一类对象),但是有一个assign()函数:

assign(dbname,  get(dbname)[!is.na( get(dbname)[varname] ), ] )

您也不想使用-which(.)。它会在这里工作,因为有一些匹配条件。但是,只要没有任何匹配的行,它就会咬你,而不是按照它应该返回任何内容,它将返回所有内容,因为vec[numeric(0)] == vec。仅使用which作为“积极”选择。

答案 1 :(得分:4)

正如@Dason建议的那样,列表是为这种工作而制作的。

E.g:

# make a list with all your data.frames in it 
# (just repeating the one data.frame 3x for this example)
alldfs <- list(mydataframe,mydataframe,mydataframe)

# apply your function to all the data.frames in the list
# have replaced original function in line with @DWin and @flodel's comments
# pointing out issues with using -which(...)
lapply(alldfs, function(x) x[!is.na(x$ID),])

答案 2 :(得分:2)

使用数据框列表的建议很好,但我认为人们假设您处于同时加载所有数据框的情况。这可能不一定是这种情况,例如,如果您正在处理许多项目,并且只想在所有项目中使用一些样板代码。

这样的事情应该符合要求。

stripNAs <- function(df, var) df[!is.na(df[[var]]), ]

mydataframe <- stripNAs(mydataframe, "ID")
cars <- stripNAs(cars, "speed")

答案 3 :(得分:1)

我完全理解你对此的需求,因为我经常需要循环一组数据帧。我相信以下代码可以帮助您:

mydataframe <- data.frame(ID=c(1,2,NA,4,5,NA),score=11:16)

#define target dataframe and varname
dbname <- "mydataframe"
varname <- "ID"

tmp.df <- get(dbname) #get df and give it a temporary name
col.focus <- which(colnames(tmp.df) == varname) #define the column of focus
tmp.df <- tmp.df[which(!is.na(tmp.df[,col.focus])),] #cut out the subset of the df where the column of focus is not NA. 

#Result
  ID score
1  1    11
2  2    12
4  4    14
5  5    15