දත්ත රාමු තීරු නමින් දමන්න


894

දත්ත රාමුවකින් ඉවත් කිරීමට මා කැමති තීරු ගණනාවක් මා සතුව ඇත. මෙවැනි දෙයක් භාවිතා කර අපට ඒවා තනි තනිව මකා දැමිය හැකි බව මම දනිමි:

df$x <- NULL

නමුත් මම බලාපොරොත්තු වූයේ අඩු විධානයන් සමඟ මෙය කිරීමටයි.

එසේම, පූර්ණ සංඛ්‍යා සුචිගත කිරීම මඟින් මට තීරු අතහැර දැමිය හැකි බව මම දනිමි:

df <- df[ -c(1, 3:6, 12) ]

නමුත් මගේ විචල්‍යයන්ගේ සාපේක්ෂ පිහිටීම වෙනස් විය හැකි යැයි මම සිතමි.

R කොතරම් බලවත්ද යන්න සලකා බැලූ විට, එක් එක් තීරුව එකින් එක අතහැරීමට වඩා හොඳ ක්‍රමයක් තිබිය හැකි යැයි මම සිතුවෙමි.


14
ආර් වැනි සරල දෙයක් නොමැති වීමට යමෙකුට මට පැහැදිලි කළ හැකිද df#drop(var_name), ඒ වෙනුවට, අප විසින් මෙම සංකීර්ණ වැඩ කටයුතු කළ යුතුද?
ifly6

2
@ ifly6 R හි 'උප කුලකය ()' ශ්‍රිතය පයිතන්හි 'ඩ්‍රොප් ()' ශ්‍රිතය තරම්ම විකාර සහගත ය, ඔබට අක්ෂ තර්කය සඳහන් කිරීමට අවශ්‍ය නොවන්නේ නම් ... එය කළ නොහැකි වීම කරදරයක් බව මම එකඟ වෙමි තීරුවක් හැලීම තරම් මූලික දෙයක් සඳහා පුවරුව පුරා ක්‍රියාත්මක කර ඇති එකකි, අවසාන, පහසු වචන / වාක්‍ය ඛණ්ඩය.
පෝල් සොචකි

Answers:


934

ඔබට සරල නම් ලැයිස්තුවක් භාවිතා කළ හැකිය:

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

නැතහොත්, විකල්පයක් ලෙස, ඔබට ඒවා තබා ගැනීමට සහ ඒවා නම් වලින් යොමු කිරීමට ලැයිස්තුවක් සෑදිය හැකිය:

keeps <- c("y", "a")
DF[keeps]

සංස්කරණය කරන්න: dropසුචිගත කිරීමේ ශ්‍රිතයේ තර්කය තවමත් නොදන්නා අය සඳහා , ඔබට එක් තීරුවක් දත්ත රාමුවක් ලෙස තබා ගැනීමට අවශ්‍ය නම්, ඔබ කරන්නේ:

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE(හෝ එය සඳහන් නොකිරීම) අනවශ්‍ය මානයන් අතහැර දමනු ඇත, එබැවින් තීරුවේ අගයන් සහිත දෛශිකයක් ආපසු එවන්න y.


19
එක් තීරුවක් සහිත දත්ත රාමුවක් දෛශිකයක් බවට පරිවර්තනය නොවන බැවින් උප කුලකයේ ක්‍රියාකාරිත්වය වඩා හොඳින් ක්‍රියා කරයි
mut1na

3
1 mut1na පරාමිති ශ්‍රිතය පරික්ෂා කරන්න drop = FALSE.
ජෝරිස් මේස්

4
DF[,keeps]වෙනුවට එසේ විය යුතු DF[keeps]නොවේද?
ලින්ඩෙලොෆ්

8
indlindelof No. එයට හැකි නමුත් ඔබ එක් තීරුවක් පමණක් තෝරා ගන්නේ නම් R ඔබේ දත්ත රාමුව දෛශිකයක් බවට පරිවර්තනය කිරීමෙන් වළක්වා ගැනීමට drop = FALSE එකතු කළ යුතුය. දත්ත රාමු ලැයිස්තු බව අමතක නොකරන්න, එබැවින් ලැයිස්තු තේරීම (මා කළාක් මෙන් එක්-මාන) හොඳින් ක්‍රියාත්මක වන අතර සෑම විටම ලැයිස්තුවක් ලබා දෙයි. නැතහොත් මෙම නඩුවේ දත්ත රාමුවක්, ඒ නිසා මම එය භාවිතා කිරීමට කැමැත්තෙමි.
ජෝරිස් මේස්

7
@ අජේ ඕහ්රි ඔව්. කොමාවකින් තොරව, ඔබ තෝරා ගැනීමේ "ලැයිස්තුව" ක්‍රමය භාවිතා කරයි, එයින් අදහස් වන්නේ ඔබ තනි තීරුවක් උපුටා ගත් විට පවා ඔබට දත්ත රාමුවක් නැවත ලබා ගත හැකි බවයි. ඔබ "අනුකෘතිය" ක්‍රමය භාවිතා කරන්නේ නම්, ඔබ දැන සිටිය යුතුය, ඔබ තනි තීරුවක් පමණක් තෝරා ගන්නේ නම්, දත්ත රාමුවක් වෙනුවට දෛශිකයක් ඔබට ලැබෙනු ඇත. එය වළක්වා ගැනීම සඳහා, ඔබ drop = FALSE එකතු කළ යුතුය. මගේ පිළිතුරෙන් පැහැදිලි කර ඇති පරිදි, සහ ඔබට ඉහළින් ඇති අදහස් දැක්වීමේදී ...
ජෝරිස් මේස්

460

subsetඔබට අවශ්‍ය කුමන තීරු දැයි ඔබ දන්නේ නම් ප්‍රයෝජනවත් වන විධානය ද ඇත :

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

@Hadley විසින් අදහස් පසු යාවත්කාලීන කිරීම: සඳහා අතහැර තීරු ඔබට කළ හැකි A, C:

df <- subset(df, select = -c(a, c))

3
මම ඇත්තටම ආර් කැමති subsetකාර්යය සැබෑ කිරීමට හැකි, එනම්, සියලු තීරු අත කළ විට "inverts" තෝරා "allbut = අසත්ය", වැනි විකල්පය හැර තුල සිටින අය selectලැයිස්තුව.
ප්‍රසාද් චලසානි

4
@ ප්‍රසාද්, පහත @jois පිළිතුර බලන්න. කිසිදු උප කුලක නිර්ණායකයක් නොමැති උප කුලකයක් ටිකක් අධික ලෙස මරා දැමීමකි. සරලව උත්සාහ කරන්න:df[c("a", "c")]
ජේ ඩී ලෝන්ග්

@ ජේඩී මම එය දැන සිටියෙමි, නමුත් subsetතීරු නම් වටා උපුටා දැක්වීම් කිරීමට අවශ්‍ය නොවන විධානයේ සින්ටැක්ටික් පහසුව සඳහා මම කැමතියි
ප්‍රසාද් චලසානි

11
ඔබ subsetවෙනත් කාර්යයන් තුළ භාවිතා නොකළ යුතු බව සලකන්න .
අරි බී. ෆ්‍රීඩ්මන්


207
within(df, rm(x))

බොහෝ විට පහසුම හෝ බහු විචල්‍ය සඳහා:

within(df, rm(x, y))

නැතහොත් ඔබ data.tables සමඟ ගනුදෙනු කරන්නේ නම් ( දත්ත.ටේබල් හි නම අනුව තීරුවක් මකා දමන්නේ කෙසේද? ):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

හෝ බහු විචල්යයන් සඳහා

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]

26
within(df, rm(x))වන බොහෝ දුරට පිරිසිදුම විසඳුමක්. මෙය හැකියාවක් බැවින් අනෙක් සෑම පිළිතුරක්ම විශාලත්වයේ අනුපිළිවෙලකින් අනවශ්‍ය ලෙස සංකීර්ණ බව පෙනේ.
මයිල්ස් එරික්සන්

2
බව සටහන within(df, rm(x))ඇත නොහැකි නම් අනුපිටපත් තීරු පවතී නම්, වැඩ xගැන df.
මයිකල් චිරිකෝ

2
Ic මයිකල්චිරිකෝ පැහැදිලි කිරීම සඳහා, එය ඉවත් නොකරන නමුත් දත්තවල අගයන් වෙනස් කරන බවක් පෙනේ. මෙය එසේ නම් යමෙකුට විශාල ගැටළු තිබේ, නමුත් මෙන්න උදාහරණයක්: df <- data.frame(x = 1, y = 2); names(df) <- c("x", "x"); within(df, rm(x))ප්‍රතිලාභ data.frame(x = 2, x = 2).
මැක්ස් ගෙනිස්

1
Iles මයිල්ස් එරික්සන් ගැටළුව නම් ඔබ within()බලවත් වන අතර එන්එස්ඊ භාවිතා කරන ශ්‍රිතයක් මත රඳා සිටීමයි . උපකාරක පිටුවෙහි සටහනෙහි පැහැදිලිවම සඳහන් වන්නේ වැඩසටහන්කරණය සඳහා ප්‍රමාණවත් සැලකිල්ලක් භාවිතා කළ යුතු බවයි.
ජෝරිස් මේස්

Iles මයිල්ස් එරික්සන් අනුපිටපත් නාම සහිත දත්ත රාමුවක් කෙනෙකුට කොපමණ වාරයක් හමු වේද?
HSchmale

119

ඔබට %in%මේ ආකාරයට භාවිතා කළ හැකිය :

df[, !(colnames(df) %in% c("x","bar","foo"))]

1
මට යමක් මග හැරී තිබේද, නැතහොත් මෙය ජොරිස්ගේ පිළිතුරේ පළමු කොටසට සමාන විසඳුමක්ද? DF[ , !(names(DF) %in% drops)]
ඩැනියෙල් ෆ්ලෙචර්

10
An ඩැනියෙල් ෆ්ලෙචර්: එය එසේමයි. පිළිතුරු වල කාලරාමු දෙස බලන්න. අපි එකම වේලාවක පිළිතුරු දුන්නා ... අවුරුදු 5 කට පෙර. :)
ජෝෂුවා උල්රිච්

5
නට්ටි. identical(post_time_1, post_time_2) [1] TRUE = ඩී
ඩැනියෙල් ෆ්ලෙචර්

57

ලැයිස්තුව (NULL) ද ක්‍රියාත්මක වේ:

dat <- mtcars
colnames(dat)
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
# [11] "carb"
dat[,c("mpg","cyl","wt")] <- list(NULL)
colnames(dat)
# [1] "disp" "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"

1
දීප්තිමත්! මෙය NULL පැවරුම ස්වාභාවික ආකාරයකින් තනි තීරුවකට විහිදෙන අතර (පෙනෙන ආකාරයට) පිටපත් කිරීමෙන් වැළකී සිටියි (කබාය යටතේ කුමක් සිදුවේදැයි මා නොදන්නා නමුත් එය මතක භාවිතයේ වඩා කාර්යක්ෂම නොවනු ඇත ... නමුත් මට පැහැදිලිව පෙනේ වඩාත් කාර්යක්ෂම සින්ටැක්ටිකල්.)
c-urchin

6
ඔබට ලැයිස්තුවක් අවශ්‍ය නොවේ (NULL), NULL ප්‍රමාණවත්ය. උදා: dat [, 4] = NULL
CousinCocaine

9
OP හි ප්‍රශ්නය වූයේ තීරු කිහිපයක් මකා දැමිය යුතු ආකාරයයි. dat [, 4: 5] <- NULL ක්‍රියා නොකරයි. ලැයිස්තුව (NULL) එන්නේ එතැනිනි. එය තීරු 1 ක් හෝ වැඩි ගණනක් සඳහා ක්‍රියා කරයි.
වින්සන්ට්

අනුපිටපත් තීරුවේ නමක් ඉවත් කිරීමට උත්සාහ කරන විට මෙයද ක්‍රියා නොකරයි.
මයිකල් චිරිකෝ

Ic මයිකල්චිරිකෝ මට හොඳින් වැඩ කරයි. ඔබට එකම නම සහිත පළමු තීරු ඉවත් කිරීමට අවශ්‍ය නම් ලේබලයක් දෙන්න හෝ ඔබට ඉවත් කිරීමට අවශ්‍ය සෑම තීරුවකටම දර්ශක ලබා දෙන්න. එය ක්‍රියාත්මක නොවන තැන ඔබට උදාහරණයක් තිබේ නම් මම එය දැකීමට කැමැත්තෙමි. සමහර විට එය නව ප්‍රශ්නයක් ලෙස පළ කළ හැකිද?
වින්සන්ට්

43

ඔබට අවශ්‍ය නම් තීරු යොමු කර ඉවත් කර ඒ හා සම්බන්ධ අභ්‍යන්තර පිටපත් කිරීමෙන් වළකින්න, data.framesඑවිට ඔබට data.tableපැකේජය සහ ශ්‍රිතය භාවිතා කළ හැකිය:=

ඔබට අක්ෂර දෛශික නම් :=ක්‍රියාකරුගේ වම් පැත්තට සහ NULLRHS ලෙස යැවිය හැකිය .

library(data.table)

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply  DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #

DT[, c('a','b') := NULL]

ඇමතුමට පිටින් අක්ෂර දෛශිකයක් ලෙස නම් පූර්ව නිශ්චය කිරීමට ඔබට අවශ්‍ය නම් [, වස්තුවේ නම ඔතා ()හෝ {}LHS ඇමතීමේ විෂය පථය තුළ ඇගයීමට බල කරන්න DT.

del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <-  <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.   

ඔබ ද භාවිතා කළ හැකිය setයන පොදු කාර්ය නැඟුණත්, [.data.table, ද සඳහා ක්රියා data.frames!

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)

# drop `a` from df (no copying involved)

set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)

41

Grep () සංඛ්‍යාත්මක දෛශිකයක් ආපසු ලබා දෙනු ඇත යන කාරණය මත පදනම්ව වඩාත් ප්‍රබල උපාය මාර්ගයක් ඇත. මගේ එක් දත්ත කට්ටලයක මෙන් ඔබට දිගු විචල්‍ය ලැයිස්තුවක් තිබේ නම්, සමහර විචල්‍යයන් ".A" වලින් අවසන් වන අතර අනෙක් ඒවා ".B" වලින් අවසන් වන අතර ඔබට අවශ්‍ය වන්නේ ".A" වලින් අවසන් වන ඒවා පමණි (දිගේ රටාවට නොගැලපෙන සියලු විචල්‍යයන් සමඟ මෙය කරන්න:

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

ජෝරිස් මේස් උදාහරණය භාවිතා කරමින්, එය එතරම් සංයුක්ත නොවිය හැකි නමුත් එය එසේ වනු ඇත:

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]

1
අප dropsමුලින් අර්ථ දක්වන්නේ නම් paste0("^", drop_cols, "$"), මෙය වඩාත් හොඳ වනු ඇත (කියවන්න: වඩා සංයුක්ත) sapply:DF[ , -sapply(drops, grep, names(DF))]
මයිකල් චිරිකෝ

33

තවත් dplyrපිළිතුරක්. ඔබේ විචල්‍යයන්ට පොදු නම් කිරීමේ ව්‍යුහයක් තිබේ නම්, ඔබට උත්සාහ කළ හැකිය starts_with(). උදාහරණයක් වශයෙන්

library(dplyr)
df <- data.frame(var1 = rnorm(5), var2 = rnorm(5), var3 = rnorm (5), 
                 var4 = rnorm(5), char1 = rnorm(5), char2 = rnorm(5))
df
#        var2      char1        var4       var3       char2       var1
#1 -0.4629512 -0.3595079 -0.04763169  0.6398194  0.70996579 0.75879754
#2  0.5489027  0.1572841 -1.65313658 -1.3228020 -1.42785427 0.31168919
#3 -0.1707694 -0.9036500  0.47583030 -0.6636173  0.02116066 0.03983268
df1 <- df %>% select(-starts_with("char"))
df1
#        var2        var4       var3       var1
#1 -0.4629512 -0.04763169  0.6398194 0.75879754
#2  0.5489027 -1.65313658 -1.3228020 0.31168919
#3 -0.1707694  0.47583030 -0.6636173 0.03983268

දත්ත රාමුවේ විචල්‍ය අනුක්‍රමයක් අතහැර දැමීමට ඔබට අවශ්‍ය නම්, ඔබට භාවිතා කළ හැකිය :. ඔබ අතහැර දැමීමට අවශ්ය නම්, උදාහරණයක් ලෙස var2, var3සහ සියලු අතර විචල්ය, ඔබ ඉතිරි කළ කැමතියි var1:

df2 <- df1 %>% select(-c(var2:var3) )  
df2
#        var1
#1 0.75879754
#2 0.31168919
#3 0.03983268

1
රීජෙක්ස් පිළිගන්නා හෝ select()වැනි වෙනත් සියලු අවස්ථාවන් ගැන අමතක නොකරන්න . contains()matches()
ha-pu

24

Dplyr විසඳුම

මෙය මෙහි වැඩි අවධානයක් යොමු කරනු ඇතැයි මම සැක කරමි, නමුත් ඔබට ඉවත් කිරීමට අවශ්‍ය තීරු ලැයිස්තුවක් තිබේ නම්, සහ dplyrමම එය භාවිතා one_of()කරන දාමයකින් එය කිරීමට ඔබට අවශ්‍ය නම්select වගන්තියේ :

මෙන්න සරල, ප්‍රජනනය කළ හැකි උදාහරණයක්:

undesired <- c('mpg', 'cyl', 'hp')

mtcars <- mtcars %>%
  select(-one_of(undesired))

ධාවනය කිරීමෙන් ලේඛන සොයාගත හැකිය ?one_of හෝ මෙහි :

http://genomicsclass.github.io/book/pages/dplyr_tutorial.html


23

තවත් හැකියාවක්:

df <- df[, setdiff(names(df), c("a", "c"))]

හෝ

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]

2
setdiffතීරු විශාල සංඛ්‍යාවක භාවිතා කිරීම ප්‍රශස්ත බැවින් මෙය වැඩි දියුණු නොකිරීම ඉතා නරක ය .
ctbrown

මේ පිළිබඳ තවත් කෝණයක්:df <- df[ , -which(grepl('a|c', names(df)))]
ජෝ

23
DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
DF

ප්‍රතිදානය:

    x  y z  a
1   1 10 5 11
2   2  9 5 12
3   3  8 5 13
4   4  7 5 14
5   5  6 5 15
6   6  5 5 16
7   7  4 5 17
8   8  3 5 18
9   9  2 5 19
10 10  1 5 20

DF[c("a","x")] <- list(NULL)

ප්‍රතිදානය:

        y z
    1  10 5
    2   9 5
    3   8 5
    4   7 5
    5   6 5
    6   5 5
    7   4 5
    8   3 5    
    9   2 5
    10  1 5

22

උනන්දුවෙන්, මෙය R හි අමුතු බහු සින්ටැක්ස් නොගැලපීම් වලින් එකක් සලකුණු කරයි. උදාහරණයක් ලෙස තීරු දෙකක දත්ත රාමුවක් ලබා දී ඇත:

df <- data.frame(x=1, y=2)

මෙය දත්ත රාමුවක් ලබා දෙයි

subset(df, select=-y)

නමුත් මෙය දෛශිකයක් ලබා දෙයි

df[,-2]

මේ සියල්ල විස්තර කර ඇති ?[නමුත් එය හරියටම අපේක්ෂිත හැසිරීම නොවේ. හොඳයි අවම වශයෙන් මට නොවේ ...


19

මෙන්න dplyrඒ සඳහා යා හැකි ක්‍රමයක්:

#df[ -c(1,3:6, 12) ]  # original
df.cut <- df %>% select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)  # with dplyr::select()

මම මෙයට කැමතියි, එය ව්‍යාඛ්‍යාවකින් තොරව කියවීමට හා තේරුම් ගැනීමට සහ දත්ත රාමුව තුළ පිහිටීම වෙනස් කරන තීරු වලට ශක්තිමත් බැවින්. -මූලද්‍රව්‍ය ඉවත් කිරීම සඳහා දෛශිකකරණය කරන ලද අයිඩියම් ද එය අනුගමනය කරයි .


(1) පරිශීලකයාට මුල් ඩීඑෆ් වෙනුවට ආදේශ කිරීමට අවශ්‍ය බව (2) මැග්‍රිටර්ට %<>% ආදාන වස්තුව ප්‍රතිස්ථාපනය කිරීමට ක්‍රියාකරු ඇතdf %<>% select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)
මාරෙක්

1
අතහැර දැමීමට ඔබට දිගු තීරු ලැයිස්තුවක් තිබේ නම් dplyr, ඒවා df.cut <- df %>% select(-c(col.to.drop.1, col.to.drop.2, ..., col.to.drop.n))
කාණ්ඩගත

14

වඩා හොඳ මෝඩකමක් තිබිය යුතු යැයි මම සිතමි, නමුත් තීරු නමින් අඩු කිරීම සඳහා, මම පහත සඳහන් දේ කිරීමට නැඹුරු වෙමි:

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)

# return everything except a and c
df <- df[,-match(c("a","c"),names(df))]
df

4
තරගය ප්‍රතික්ෂේප කිරීම හොඳ අදහසක් නොවේ -df[,-match(c("e","f"),names(df))]
හැඩ්ලි

D JDLong - තීරුවේ නම ආරම්භ වන තීරුව අතහැර දැමීමට මට අවශ්‍ය නම් කුමක් කළ -යුතුද?
චෙතන් අරවින්ද් පටිල්

12

නමින් උත්සවයක් තියෙනවා dropNamed()බර්න්ඩ් Bischl ගණන්වල BBmiscහරියටම මෙය කරන පැකේජය.

BBmisc::dropNamed(df, "x")

වාසිය නම්, එය දත්ත රාමු තර්කය පුනරාවර්තනය වීම වළක්වන අතර එමඟින් නල මාර්ගයට සුදුසු වේ magrittr( dplyrප්‍රවේශයන් මෙන් ):

df %>% BBmisc::dropNamed("x")

9

ඉහත @ හැඩ්ලි භාවිතා කිරීමට ඔබට අවශ්‍ය නැතිනම් තවත් විසඳුමක්: "COLUMN_NAME" නම් ඔබට අතහැර දැමීමට අවශ්‍ය තීරුවේ නම:

df[,-which(names(df) == "COLUMN_NAME")]

1
(1) ගැටළුව වන්නේ එකවර තීරු කිහිපයක් අතහැර දැමීමයි. (2) නොමැති නම් COLUMN_NAMEඑය ක්‍රියා නොකරනු ඇත df(ඔබම පරීක්ෂා කරන්න :) df<-data.frame(a=1,b=2). (3) df[,names(df) != "COLUMN_NAME"]සරල වන අතර එයින් පීඩා විඳින්න එපා (2)
මාරෙක්

මෙම පිළිතුර ගැන තවත් තොරතුරු ලබා දිය හැකිද?
ආකාෂ් නායක

8

ඔබ්බට select(-one_of(drop_col_names))පෙර පිළිතුරු පෙන්නුම් යුවලක් වෙනත් ඇත dplyrභාවිතා තීරු පහත වැටේ සඳහා විකල්ප select()බව (තීරු නම් සමහර විවිධත්වය සඳහා dplyr starwars නියැදි දත්ත භාවිතා කරමින්) සියලු විශේෂිත තීරුව නම් නිර්වචනය අදාල නොවන:

library(dplyr)
starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  select(-contains('color')) %>%  # any column name that contains 'color'
  select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
  select(-ends_with('er')) %>%    # any column name that ends with 'er'
  select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%     # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

ඔබට දත්ත රාමුව තුළ තිබිය හැකි හෝ නොවිය හැකි තීරුවක් අතහැර දැමීමට අවශ්‍ය නම්, මෙහි සුළු පෙරළියක් භාවිතා select_if()කිරීම මෙන් නොව , තීරුවේ නම නොපවතින one_of()විට Unknown columns:අනතුරු ඇඟවීමක් නොකරනු ඇත. මෙම උදාහරණයේ දී 'bad_column' යනු දත්ත රාමුවේ තීරුවක් නොවේ:

starwars %>% 
  select_if(!names(.) %in% c('height', 'mass', 'bad_column'))

4

ඉවත් කිරීම සඳහා දත්ත රාමුව සහ කොමාවෙන් වෙන් කළ නම් මාලාවක් සපයන්න :

remove_features <- function(df, features) {
  rem_vec <- unlist(strsplit(features, ', '))
  res <- df[,!(names(df) %in% rem_vec)]
  return(res)
}

භාවිතය :

remove_features(iris, "Sepal.Length, Petal.Width")

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1

ඔබට භාවිතයෙන් ඉවත් කිරීමට අවශ්‍ය තීරු වල දර්ශකය සොයා ගන්න which. මෙම දර්ශකවලට negative ණ ලකුණක් දෙන්න ( *-1). ඉන්පසු එම අගයන් අනුකොටස් කරන්න, එමඟින් ඒවා දත්ත රාමුවෙන් ඉවත් කරනු ඇත. මෙය නිදසුනකි.

DF <- data.frame(one=c('a','b'), two=c('c', 'd'), three=c('e', 'f'), four=c('g', 'h'))
DF
#  one two three four
#1   a   d     f    i
#2   b   e     g    j

DF[which(names(DF) %in% c('two','three')) *-1]
#  one four
#1   a    g
#2   b    h

1

ඔබට විශාල ප්‍රමාණයක් තිබේ නම් data.frameසහ මතක භාවිතය අඩු නම් [ . . . . හෝ rmසහwithin කිරීමට ඇති තීරු ඉවත්data.frame ලෙස subsetකිරීමට අත්පොතේ ඉඟියක් ළඟ - වැඩි මතක භාවිතා (වි 3.6.2) දැනට භාවිතා subsetඅනොන්ය .

getData <- function() {
  n <- 1e7
  set.seed(7)
  data.frame(a = runif(n), b = runif(n), c = runif(n), d = runif(n))
}

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- DF[setdiff(names(DF), c("a", "c"))] ##
#DF <- DF[!(names(DF) %in% c("a", "c"))] #Alternative
#DF <- DF[-match(c("a","c"),names(DF))]  #Alternative
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- subset(DF, select = -c(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#357 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- within(DF, rm(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF[c("a", "c")]  <- NULL ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.