How does R do it, and should I ever be worried? I always remove
columns by index, and it works exactly as I would naively expect - but
HOW? The second illustration, which deletes non contiguous columns,
represents what I do all the time and have some trepidation about
because I don't know the mechanics (e.g. why doesn't the column
formerly-known-as-4 become 3 after column 1 is dropped: doesn't vector
removal from a df/list invoke a loop in C?). Can I delete a named
list of columns, which are examples 4 and 5 and which generate the
"unary error' mesages, without resorting to "orig.df$num1.10 <-
NULL"?
Thanks!
orig.df <- data.frame(cbind(
1:10
,11:20
,letters[1:10]
,letters[11:20]
,LETTERS[1:10]
,LETTERS[11:20]
))
names(orig.df) <- c(
'num1.10'
,'num11.20'
,'lc1.10'
,'lc11.20'
,'uc1.10'
,'uc11.20'
)
# Illustration 1: contiguous columns at beginning of data frame
head(orig.df[,-c(1:3)])
# Illustration 2: non-contiguous columns
head(orig.df[,-c(1,3,5)])
# Illustration 3: contiguous columns at end of data frame
head(orig.df[,-c(4:6)]) ## as expected
# Illustrations 4-5: unary errors
head(orig.df[,-c(as.list('num1.10', 'lc1.10',
'uc1.10'))])
head(orig.df[,-c('num1.10', 'lc1.10', 'uc1.10')])
Mike
On Jan 6, 2012, at 10:00 AM, Mike Harwood wrote:> How does R do it, and should I ever be worried? I always remove > columns by index, and it works exactly as I would naively expect - but > HOW? The second illustration, which deletes non contiguous columns, > represents what I do all the time and have some trepidation about > because I don't know the mechanics (e.g. why doesn't the column > formerly-known-as-4 become 3 after column 1 is dropped: doesn't vector > removal from a df/list invoke a loop in C?).You are NOT "removing columns". You are returning (to `head` and then to `print`) an extract from the dataframe, but that does not change the original dataframe. To effect a change you would need to assign the value back to the same name as the original daatframe. -- David> Can I delete a named > list of columns, which are examples 4 and 5 and which generate the > "unary error' mesages, without resorting to "orig.df$num1.10 <- NULL"? > > Thanks! > > orig.df <- data.frame(cbind( > 1:10 > ,11:20 > ,letters[1:10] > ,letters[11:20] > ,LETTERS[1:10] > ,LETTERS[11:20] > )) > names(orig.df) <- c( > 'num1.10' > ,'num11.20' > ,'lc1.10' > ,'lc11.20' > ,'uc1.10' > ,'uc11.20' > ) > # Illustration 1: contiguous columns at beginning of data frame > head(orig.df[,-c(1:3)]) > > # Illustration 2: non-contiguous columns > head(orig.df[,-c(1,3,5)]) > > # Illustration 3: contiguous columns at end of data frame > head(orig.df[,-c(4:6)]) ## as expected > > # Illustrations 4-5: unary errors > head(orig.df[,-c(as.list('num1.10', 'lc1.10', 'uc1.10'))]) > head(orig.df[,-c('num1.10', 'lc1.10', 'uc1.10')]) > > > Mike > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius, MD West Hartford, CT
On Fri, Jan 6, 2012 at 10:00 AM, Mike Harwood <harwood262 at gmail.com> wrote:> How does R do it, and should I ever be worried?You should be worried, but not about that.> ?I always remove > columns by index, and it works exactly as I would naively expect - but > HOW? ?The second illustration, which deletes non contiguous columns, > represents what I do all the time and have some trepidation about > because I don't know the mechanics (e.g. why doesn't the column > formerly-known-as-4 become 3 after column 1 is dropped: doesn't vector > removal from a df/list invoke a loop in C?).The R programmers, and the S programmers before them, were smart enough to make this a simultaneous rather than sequential operation. If you really need the details, the source is out there.> Can I delete a named > list of columns, which are examples 4 and 5 and which generate the > "unary error' mesages, without resorting to "orig.df$num1.10 <- NULL"?head(orig.df[, !colnames(orig.df) %in% c('num1.10', 'lc1.10', 'uc1.10')]) Sarah> Thanks! > > orig.df <- data.frame(cbind( > ? ? ? ?1:10 > ? ? ? ?,11:20 > ? ? ? ?,letters[1:10] > ? ? ? ?,letters[11:20] > ? ? ? ?,LETTERS[1:10] > ? ? ? ?,LETTERS[11:20] > ? ? ? ?)) > names(orig.df) <- c( > ? ? ? ?'num1.10' > ? ? ? ?,'num11.20' > ? ? ? ?,'lc1.10' > ? ? ? ?,'lc11.20' > ? ? ? ?,'uc1.10' > ? ? ? ?,'uc11.20' > ? ? ? ?) > # Illustration 1: contiguous columns at beginning of data frame > head(orig.df[,-c(1:3)]) > > # Illustration 2: non-contiguous columns > head(orig.df[,-c(1,3,5)]) > > # Illustration 3: contiguous columns at end of data frame > head(orig.df[,-c(4:6)]) ? ? ? ? ## as expected > > # Illustrations 4-5: unary errors > head(orig.df[,-c(as.list('num1.10', 'lc1.10', 'uc1.10'))]) > head(orig.df[,-c('num1.10', 'lc1.10', 'uc1.10')]) > > > Mike >-- Sarah Goslee http://www.functionaldiversity.org