2016-06-23 2 views
3

У нас есть кадр данных, как показано ниже:Число уникальных значений во всех столбцов в кадре данных

raw<-data.frame(v1=c("A","B","C","D"),v2=c(NA,"B","C","A"),v3=c(NA,"A",NA,"D"),v4=c(NA,"D",NA,NA)) 

мне нужен кадр данных результата в следующем формате:

result<-data.frame(v1=c("A","B","C","D"), v2=c(3,2,2,3)) 

Использовались следующие код для получения счета через один конкретный столбец:

count_raw<-sqldf("SELECT DISTINCT(v1) AS V1, COUNT(v1) AS count FROM raw GROUP BY v1") 

Это вернет счет уникальных значений по индивидууму двойной колонка.

Любая помощь будет высоко оценена.

+0

Ваши входные данные и выходные не совпадают. –

ответ

1

Мы можем использовать apply с MARGIN = 1

cbind(raw[1], v2=apply(raw, 1, function(x) length(unique(x[!is.na(x)])))) 

Если для каждого столбца

sapply(raw, function(x) length(unique(x[!is.na(x)]))) 

Или, если нам нужно счетчик на основе всех столбцов, преобразовать в matrix и использовать table

table(as.matrix(raw)) 
# A B C D 
# 3 2 2 3 
+11

Все выдержки на комментариях @ docendodiscimus и нулевые подсказки на ваш ответ могут быть вызваны тем, что: ** 1 **. Большинство думают, что docendodiscimus прав, или более тревожный вариант ** 2 **. Большинство из вас знают о вашем детском поведении на SO и сразу же предполагают, что вы ошибаетесь. В любом случае, сообщество * говорит * вам изменить. – zx8754

+5

FYI: http://stackoverflow.com/posts/37983822/timeline (И поскольку SO использует несколько интерфейсов, время ожидания всегда возможно между интерфейсами. Вызов за кем-то, потому что он опубликовал то же самое решение, действительно плохое поведение) – Tensibai

1

Если у вас есть только значения символов в вашем dataframe, как вы предоставили, вы можете unlist и использовать unique или подсчитывать частота, используйте count

> library(plyr) 
> raw<-data.frame(v1=c("A","B","C","D"),v2=c(NA,"B","C","A"),v3=c(NA,"A",NA,"D"),v4=c(NA,"D",NA,NA)) 
> unique(unlist(raw)) 
[1] A B C D <NA> 
Levels: A B C D 
> count(unlist(raw)) 
    x freq 
1 A 3 
2 B 2 
3 C 2 
4 D 3 
5 <NA> 6 
3

Если вы хотите, общее количество,

sapply(unique(raw[!is.na(raw)]), function(i) length(which(raw == i))) 
#A B C D 
#3 2 2 3 
12

Используйте этот

table(unlist(raw)) 

Выход

A B C D 
3 2 2 3 

Для вывода данных типа кадра обернуть это с as.data.frame.table

as.data.frame.table(table(unlist(raw))) 

Выход

Var1 Freq 
1 A 3 
2 B 2 
3 C 2 
4 D 3