Выдаленне радкоў у кадры дадзеных з дапамогай функцыі GET

Выкажам здагадку, я наступны кадр дадзеных:

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
Egads. Чаму? Чаму вы гэта робіце? Я гарантую, што ёсць лепшы шлях. Хутчэй за ўсё, з дапамогай спісаў. Яна заўсёды зводзіцца да выкарыстання спісаў ...
дададзена аўтар Dason, крыніца
Egads. Чаму? Чаму вы гэта робіце? Я гарантую, што ёсць лепшы шлях. Хутчэй за ўсё, з дапамогай спісаў. Яна заўсёды зводзіцца да выкарыстання спісаў ...
дададзена аўтар Dason, крыніца

8 адказы

There is no get<- function, and there is no get(colname) function (since colnames are not first class objects), but there is an assign() function:

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

Вы таксама не хочаце выкарыстоўваць -Якія (.) . Ён працаваў бы тут, бо там былі некаторыя матчы ў стане. Ён будзе кусаць вас, аднак, калі няма якіх-небудзь радкі, якія адпавядаюць і замест таго, каб не вяртаючы нічога, як і павінна быць, ён будзе вяртаць усё, так як VEC [лікавым (0)] == VEC . Выкарыстоўвайце толькі , які для «станоўчага» выбару.

4
дададзена
@DWin Дзякуй за адказ. Гэта тое, што я шукаў. Навучанне "атрымаць (DBName) [VarName]", таксама вельмі карысна для мяне. Акрамя таго, дзякуй за паказ магчымай шчыліны ў «-Які (.)».
дададзена аўтар HBat, крыніца
Я вельмі моцна сумняваюся, што там будзе вялікая розніца паміж mydataframe <- mydataframe [! Is.na (mydataframe [VarName]),] і правапераемнікам версія. Я прапанаваў правапераемнікам версія была паказаць, як атрымаць заданне зроблена са значэннем знака для «імя», якое, як уяўляецца, будзе ваша стратэгія. <�Код> правапераемнік ролю функцыі з'яўляецца пераўтварыць свой першы аргумент, улічваючы, як значэнне сімвала, на мове імя-R і завяршыць заданне.
дададзена аўтар 42-, крыніца
Мне падабаецца ваша тлумачэнне адносна , які . Ва ўсякім выпадку, ці ёсць розніца паміж кодам і mydataframe [! Is.na (mydataframe [VarName])] , г.зн. ёсць якія-небудзь перавагі пры выкарыстанні Прызначыць ?
дададзена аўтар fdetsch, крыніца

There is no get<- function, and there is no get(colname) function (since colnames are not first class objects), but there is an assign() function:

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

Вы таксама не хочаце выкарыстоўваць -Якія (.) . Ён працаваў бы тут, бо там былі некаторыя матчы ў стане. Ён будзе кусаць вас, аднак, калі няма якіх-небудзь радкі, якія адпавядаюць і замест таго, каб не вяртаючы нічога, як і павінна быць, ён будзе вяртаць усё, так як VEC [лікавым (0)] == VEC . Выкарыстоўвайце толькі , які для «станоўчага» выбару.

4
дададзена
@DWin Дзякуй за адказ. Гэта тое, што я шукаў. Навучанне "атрымаць (DBName) [VarName]", таксама вельмі карысна для мяне. Акрамя таго, дзякуй за паказ магчымай шчыліны ў «-Які (.)».
дададзена аўтар HBat, крыніца
Я вельмі моцна сумняваюся, што там будзе вялікая розніца паміж mydataframe <- mydataframe [! Is.na (mydataframe [VarName]),] і правапераемнікам версія. Я прапанаваў правапераемнікам версія была паказаць, як атрымаць заданне зроблена са значэннем знака для «імя», якое, як уяўляецца, будзе ваша стратэгія. <�Код> правапераемнік ролю функцыі з'яўляецца пераўтварыць свой першы аргумент, улічваючы, як значэнне сімвала, на мове імя-R і завяршыць заданне.
дададзена аўтар 42-, крыніца
Мне падабаецца ваша тлумачэнне адносна , які . Ва ўсякім выпадку, ці ёсць розніца паміж кодам і mydataframe [! Is.na (mydataframe [VarName])] , г.зн. ёсць якія-небудзь перавагі пры выкарыстанні Прызначыць ?
дададзена аўтар fdetsch, крыніца

Як вынікае @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),])
4
дададзена
@flodel - добры момант, я нават не ацаніць функцыі выкарыстоўваецца, калі я ударыў яго ў lapply . Адрэдагаваны ў цяперашні час.
дададзена аўтар thelatemail, крыніца
+1 але, калі ласка, прачытайце @ каментар Дзвіне ў пра не выкарыстоўваючы -Які і выправіць код. Іншы элегантны спосаб тут, каб зрабіць lapply (alldfs, падмноства! Is.na (ID)) .
дададзена аўтар flodel, крыніца

Як вынікае @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),])
4
дададзена
@flodel - добры момант, я нават не ацаніць функцыі выкарыстоўваецца, калі я ударыў яго ў lapply . Адрэдагаваны ў цяперашні час.
дададзена аўтар thelatemail, крыніца
+1 але, калі ласка, прачытайце @ каментар Дзвіне ў пра не выкарыстоўваючы -Які і выправіць код. Іншы элегантны спосаб тут, каб зрабіць lapply (alldfs, падмноства! Is.na (ID)) .
дададзена аўтар flodel, крыніца

Прапанова выкарыстоўваць спіс фрэймаў дадзеных добра, але я думаю, што людзі пры ўмове, што вы знаходзіцеся ў сітуацыі, калі ўсе кадры дадзеных загружаюцца адначасова. Гэта не абавязкова можа быць у выпадку, напрыклад, калі вы працуеце на шэрагу праектаў, і проста хоча, каб некаторыя шаблоннага кода для выкарыстання ва ўсіх з іх.

Нешта падобнае павінна адпавядаць патрабаванням.

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

mydataframe <- stripNAs(mydataframe, "ID")
cars <- stripNAs(cars, "speed")
2
дададзена
Калі я паспрабаваў гэта дае мне наступнае паведамленне пра памылку: Памылка ў ф.р. [[вар]]: індэкс з межаў
дададзена аўтар HBat, крыніца
@Aaron дзякуй за ловячы што, выпраўлена.
дададзена аўтар Hong Ooi, крыніца
Павінна быць mydataframe <- stripNAs (mydataframe, "ID")
дададзена аўтар Aaron, крыніца

Я магу цалкам зразумець вашу патрэбнасць у гэтым, так як я часта трэба перабраць набор кадраў дадзеных. Я лічу, што наступны код павінен дапамагчы вам:

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
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
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
1
дададзена