2015-02-18 5 views
3

Кажется, здесь отсутствует какая-то ссылка. У меня есть кадр данныхСтолбец суммирует совпадающие значения с другим столбцом

df<-data.frame(w=sample(1:3,10, replace=T), x=sample(1:3,10, replace=T), y=sample(1:3,10, replace=T), z=sample(1:3,10, replace=T)) 

> df 
    w x y z 
1 3 1 1 3 
2 2 1 1 3 
3 1 3 2 2 
4 3 1 3 1 
5 2 2 1 1 
6 1 2 2 3 
7 1 2 2 2 
8 2 2 2 3 
9 1 3 3 3 
10 2 2 1 1 

Я хочу, чтобы получить количество строк каждого столбца, который соответствует к 1-й столбец.

sum(df$w==df$x) 
[1] 3 

sum(df$w==df$y) 
[1] 2 
sum(df$w==df$z) 
[1] 1 

Я знаю, что применяя применение, я могу совершать обходные или обходные операции.

apply(df,2,length) 
w x y z 
10 10 10 10 

Как объединить эти две функции?

+0

Вы можете комбинировать их с помощью 'применить (ДФ [-1], 2, функция (сл) сумма (DF [, 1] == cl)) ', но решение Дэвида должно быть более эффективным, особенно на больших наборах данных. –

ответ

4

Попробуйте colSums

colSums(df[-1] == df[, 1]) 
# x y z 
# 3 2 1 

Или, если вы в *apply петли могли попробовать

vapply(df[-1], function(x) sum(x == df[, 1]), double(1)) 
+0

Отлично, спасибо. [rant: почему мне нужно ждать 10 минут, чтобы принять ответ) – Ananta

+0

@DavidArenburg Использование 'data.table',' setDT (df) [, lapply (.SD, function (x) sum (x == df [[1 ]])), .SDcols = -1] '. Не уверен, что это эффективно, как 'vapply' – akrun

+0

@akrun Я думал об этом, но он просто выглядел как чрезмерное, чем просто« colMeans »... –

Смежные вопросы