Potrzebuję upuścić jedną kolumnę z data.frame zawierającego kilkaset kolumn.Idiom do upuszczania pojedynczej kolumny w data.table
Z data.frame
, użyję subset
to zrobić wygodnie:
> dat <- data.table(data.frame(x=runif(10),y=rep(letters[1:5],2),z=runif(10)),key='y')
> subset(dat,select=c(-z))
x y
1: 0.1969049 a
2: 0.7916696 a
3: 0.9095970 b
4: 0.3529506 b
5: 0.4923602 c
6: 0.5993034 c
7: 0.1559861 d
8: 0.9929333 d
9: 0.3980169 e
10: 0.1921226 e
Oczywiście to nadal działa, ale wydaje się, że nie jest bardzo data.table
-jak idiomu. Mogę ręcznie skonstruować listę nazw kolumn Chciałem zachować, co wydaje się trochę więcej data.table
-jak:
> dat[,list(x,y)]
x y
1: 0.1969049 a
2: 0.7916696 a
3: 0.9095970 b
4: 0.3529506 b
5: 0.4923602 c
6: 0.5993034 c
7: 0.1559861 d
8: 0.9929333 d
9: 0.3980169 e
10: 0.1921226 e
Ale to muszę skonstruować taką listę, która jest niezgrabne.
Czy jest to właściwy sposób wygodnego upuszczenia jednej lub dwóch kolumn, czy też powoduje to spadek wydajności? Jeśli nie, jaki jest lepszy sposób?
Edit
Benchmarki:
> dat <- data.table(data.frame(x=runif(10^7),y=rep(letters[1:10],10^6),z=runif(10^7)),key='y')
> microbenchmark(subset(dat,select=c(-z)), dat[,list(x,y)])
Unit: milliseconds
expr min lq median uq max
1 dat[, list(x, y)] 102.62826 167.86793 170.72847 199.89789 792.0207
2 subset(dat, select = c(-z)) 33.26356 52.55311 53.53934 55.00347 180.8740
Ale tak naprawdę, gdzie może ważniejsza jest dla pamięci jeśli subset
kopii całego data.table
.
Jedno pytanie: jaki jest twój zamiar opuszczenia tej kolumny? Mam na myśli to, co zamierzasz zrobić z wynikowym plikiem data.table? – Arun
@Arun Szczególny przypadek, który sprawił, że zapytałem, błędnie nazwałbym kolumnę podczas tworzenia z ': =' i chciałam ją upuścić. Ale pojawia się cały czas, że zrzucanie kolumny lub dwóch jest przydatne. –
Jak wyjaśnia @mnel, jeśli chcesz po prostu usunąć, możesz bezpośrednio użyć operatora ': =' i jeśli chcesz wykonywać obliczenia bez tej kolumny, zawsze możesz użyć '.SDcols'. W ten sposób można całkowicie uniknąć rozwiązania 'subset' /' with = FALSE'. – Arun