0

假设我有以下数据框:

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

4 回答 4

4

没有get<-函数,也没有get(colname)函数(因为 colnames 不是一流的对象),但是有一个assign()函数:

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

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

于 2013-05-29T05:02:16.293 回答
4

正如@Dason 建议的那样,为这类工作制作了列表。

例如:

# 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),])
于 2013-05-29T05:05:11.977 回答
2

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

像这样的东西应该符合要求。

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

mydataframe <- stripNAs(mydataframe, "ID")
cars <- stripNAs(cars, "speed")
于 2013-05-29T05:50:26.297 回答
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
于 2013-05-29T04:56:00.787 回答