Diyelim ki böyle bir data.frame'iniz var:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Yalnızca x içindeki sayısal olan sütunları nasıl seçersiniz?
Diyelim ki böyle bir data.frame'iniz var:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Yalnızca x içindeki sayısal olan sütunları nasıl seçersiniz?
Yanıtlar:
EDIT: kötü tavsiye kullanımını önlemek için güncellendi sapply
.
Veri çerçevesi bir liste olduğundan, listeye uygula işlevlerini kullanabiliriz:
nums <- unlist(lapply(x, is.numeric))
Sonra standart alt ayar
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Daha deyimsel bir modern R için şimdi tavsiye ederim
x[ , purrr::map_lgl(x, is.numeric)]
Daha az codey, R'nin belirli tuhaflıklarını daha az yansıtıyor ve daha basit ve veritabanı arka uçlu tibble'larda kullanımı daha sağlam:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Nasıl önlersiniz?
tryCatch()
başa çıkmak için bir kullanabilirsiniz . Lütfen yeni bir soru açmayı düşünün.
Filter()
temel paketten bu kullanım durumu için mükemmel bir işlevdir: Sadece kodlamanız gerekir:
Filter(is.numeric, x)
Ayrıca aşağıdakilerden çok daha hızlıdır select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
(bilgisayarımda) için ortalama 60 mikrosaniye Filter
ve select_if
21000 mikrosaniye (350 kat daha hızlı) döndürür.
Filter()
işe yaramayan değiştirmek, örneğin Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
işe yaramaz.
yalnızca sütun adlarıyla ilgileniyorsanız, bunu kullanın:
names(dplyr::select_if(train,is.numeric))
Bu diğer cevaplara alternatif bir kod:
x[, sapply(x, class) == "numeric"]
Birlikte data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
PCAmixdata kütüphanesi, aşağıda gösterildiği gibi belirli bir veri karesi "YourDataframe" in nicel (Sayısal veri) ve nitel (Kategorik veriler) bölümünü ayıran functon splitmix'e sahiptir:
install.packages("PCAmixdata")
library(PCAmixdata)
split <- splitmix(YourDataframe)
X1 <- split$X.quanti(Gives numerical columns in the dataset)
X2 <- split$X.quali (Gives categorical columns in the dataset)
Başka bir yol şöyle olabilir:
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Çok sayıda faktör değişkeniniz varsa, fonksiyonu kullanabilirsiniz select_if
. dplyr paketlerini kurun. Bir koşulu karşılayarak verileri ayıran birçok işlev vardır. koşulları ayarlayabilirsiniz.
Bunun gibi kullan.
categorical<-select_if(df,is.factor)
str(categorical)
Bu doğrudan soruyu cevaplamaz, ancak özellikle id sütununuz ve bağımlı değişkeniniz dışında tüm sayısal sütunlar gibi bir şey istiyorsanız çok yararlı olabilir.
numeric_cols <- sapply(dataframe, is.numeric) %>% which %>%
names %>% setdiff(., c("id_variable", "dep_var"))
dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))
x[nums]
ya dax[sapply(x,is.numeric)]
çalışıyor. Ve her zaman geri dönerlerdata.frame
. Karşılaştırx[1]
vsx[,1]
- birincisidata.frame
, ikincisi bir vektör. Bir dönüşüm önlemek istiyorsanız o zaman kullanmalısınızx[, 1, drop=FALSE]
.