2015-04-11 5 views
-1

У меня есть этот пример матрицы:Почему цикл только показывает результат последнего цикла

X1 X2 X3 X4 
1 F F F F 
2 C C C C 
3 D D D D 
4 A# A# A# A 

И я пытаюсь использовать для цикла, чтобы получить число уникальных полей в каждом столбце. Вот как я пытаюсь сделать это:

y <- read.csv(file) 
frame <- data.frame(y) 
for(i in 1:4){ 
specframe <- frame[, i] 
x <- unique(specframe) 
     } 
    length(x) 

Но результат длины всего 4. Выход Я ищу вектор из 4-х элементов, в котором каждый элемент детали количество уникальных элементов их соответствующих столбцов. Похоже, цикл for переписывает x каждый раз, когда он петли, так как я могу создать вектор, который содержит элемент для каждого его цикла?

ответ

4

Этого должно быть достаточно:

y <- read.csv(file) 
x <- numeric(4) 
for(i in 1:4) { 
    x[i] <- length(unique(y[, i])) 
} 

или:

x <- apply(y,2,function(x) length(unique(x))) 
+0

Я попытался реализации вашего первого решения, но он дал правильный ответ за последний цикл четыре раза. Чтобы проверить это, я изменил четвертый столбец на пятое уникальное значение. Затем, когда я запускаю ваше первое решение, я получаю: [1] 5 5 5 5, хотя первые три столбца имеют только 4 значения. – xxxRxxx

+0

Подождите, я думаю, что я понял проблему: когда я запускаю код только для первых трех столбцов, у которых все пустое место для последней строки, они все равно возвращаются [1] 5 5 5. Поэтому я думаю, что пустое пространство считается уникальным значением. Есть ли способ предотвратить использование уникальной() функции? Я попытался использовать аргумент na.strings в функции read.csv, но unique() все еще считает, что NA является уникальным значением. – xxxRxxx

+0

Если вам нужен подробный ответ, вам нужно показать результаты запуска 'dput()' в вашем наборе входных данных ... –

1

Вы можете использовать n_distinct (обертку для length(unique() от dplyr

library(dplyr) 
df1 %>% 
    summarise_each(funs(n_distinct)) %>% 
    unlist() 
Смежные вопросы