Oto, co mam do tej pory:

  testdf=olddf;

for (i in colnames(testdf))

  if (length(unique(testdf[,i]))==1){

    testdf[,-(i)]

    }

Nie mogę dokonać wspomnianej pracy kodu. Czy ktoś może pomóc w doradzaniu tego, co robię nieprawidłowo? Zasadniczo próbuję dokonać pętli w taki sposób, że każda kolumna jest sprawdzana, aby upewnić się, że nie ma danych, które są unikalne. Na przykład, jeśli długość kolumny jest równa 1, należy ją usunąć.

Dziękuję Ci

0
g3lo 4 czerwiec 2018, 23:25

3 odpowiedzi

Najlepsza odpowiedź

W r, najlepiej jest uniknąć pętli, jeśli możesz. Nie należy ich uniknąć razem, ale włożone operacje mają tendencję do szybszego. W tej instancji sapply jest twoim przyjacielem.

df = data.frame(v1=sample(letters, 10), v2=sample(1:100, 10), v3=4, v4=sample(LETTERS, 10))
x = sapply(names(df), function(x) length(unique(df[[x]])) > 1)
df[, x]
#    v1 v2 v4
# 1   e 82  P
# 2   i 45  T
# 3   z 76  W
# 4   u 27  Y
# 5   n  2  Q
# 6   x 72  B
# 7   o 61  O
# 8   d 47  R
# 9   s 42  G
# 10  k 66  S

Aktualizacja (na podstawie rozmowy w komentarzach)

# This line of code identifies the columns that are both numeric
# and have values where max != min
good_cols = sapply(testdf, function(x) {
    is.numeric(x) && ((max(x) - min(x)) > 0)
})

# Subset the original data to just the good columns for modeling
model_df = testdf[, good_cols]

# Run the regression
lm(y ~ ., data = model_df)
1
brittenb 5 czerwiec 2018, 14:58

Nie możesz użyć - operatora indeksowania nazwy kolumny znakowej. Jedno podejście będzie korzystające z którego. Powinno to działać w twoim przypadku.

for (i in colnames(testdf)) {
  if (length(unique(testdf[,i])) == 1) {
    testdf<- testdf[,-which(colnames(testdf) == i) ]
  }
}
1
CodeBusker_JEP 4 czerwiec 2018, 20:58

Na wysokim poziomie, aby do pracy, musisz ponownie przypisać zmienną testdf. Obecnie wystarczy go wybrać. I.e, wymień testdf[, -(i)] za pomocą testdf <- testdf[, -(i)].

Również jesteś itery i nazwy i nie możesz użyć operatora - w nawiasach, aby usunąć określoną nazwę. Można jednak użyć wskaźników, choć jednak, jeśli używasz indeksów i ponownie przypiszesz testdf w pętli, prawdopodobnie usuniesz kolumny w poszukiwaniu pętli i ostatecznie próbujesz odnieść się do indeksu, który nie dłuższy istnieje w testdf.

Sugerowałbym użycie funkcji selektorów dplyr (patrz ?select_if), który pomógłby tutaj. Zobacz przykład poniżej:

library(dplyr)
temp <- mtcars %>% filter(cyl == 6)
temp %>% select_if(~length(unique(.)) > 1)
   mpg  disp  hp drat    wt  qsec vs am gear carb
1 21.0 160.0 110 3.90 2.620 16.46  0  1    4    4
2 21.0 160.0 110 3.90 2.875 17.02  0  1    4    4
3 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1
4 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1
5 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4
6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4
7 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6
0
zack 4 czerwiec 2018, 20:41