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)] == vecwhich「肯定的な」選択にのみ使用してください。

于 2013-05-29T05:02:16.293 に答える
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 に答える