假设我有以下数据框:
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”。) 提前谢谢。
答案 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