Использование значений, связанных с уникальными значениями из фрейма данных - PullRequest
1 голос
/ 15 октября 2010

У меня есть кадр данных, который похож на это - например, 2 столбца и несколько строк:

A 2

A 7

B 1

B 3

B 6

C 2

Я хочу выполнить некоторые операции с элементами во втором столбце в пределах каждого уникального значения столбца 1.

У меня есть

  unique.values <- sort(unique(mydata[,1])) 

Эта часть работает для получения каждого уникального значения, но я не знаю, как связать каждый уникальный фактор со значениями, которые он принимает во втором столбце.Мне нужно иметь возможность работать с каждым полностью независимо и иметь возможность подсчитывать строки и т. Д. Пробовал использовать grep, но не смог сделать это.

Спасибо за любую помощь, которую вы можете оказать!

Ответы [ 3 ]

2 голосов
/ 16 октября 2010

Функция ave () или tapply будут делать то, что вы хотите.Это зависит от того, что вы хотите для вывода.Если вы хотите, чтобы выходной вектор равнялся входному вектору ave (), но если вы хотите уменьшить данные до уровней вашего вектора группировки, tapply ().

ave(mydata[,2], mydata[,1], FUN = length) #FUN can be any function

Или, дляуменьшенная версия ...

tapply(mydata[,2], mydata[,1], FUN = length) #FUN can be any function
2 голосов
/ 15 октября 2010

Не совсем после вашего вопроса, но я думаю, что это то, что вы хотите:

df <- data.frame(read.table(textConnection("
A 2
A 7
B 1
B 3
B 6
C 2")))
library(plyr)
ddply(df, .(V1), nrow)

Существует множество способов сделать это, поэтому вам нужно будет предоставить более подробную информацию о том, что вы 'Если вы хотите получить лучший ответ, попробуйте.

Редактировать

В общем, если у вас есть набор уникальных значений, и вы хотите применить к ним функциюосновываясь на этом наборе, вы можете сделать это с некоторой версией функции apply.Например, в приведенном выше примере есть несколько различных способов получения среднего значения на основе первого столбца:

ddply(df, .(V1), function(x) data.frame(mean=mean(x[,2])))
do.call("rbind", by(df, df[,1], function(x) data.frame(mean=mean(x[,2]))))
do.call("rbind", lapply(unique(df[,1]), function(a) data.frame(V1=a, mean=mean(df[df[,1]==a,2]))))
0 голосов
/ 16 октября 2010

Другая возможность, снова используя df Шейна:

aggregate(df[,2],list(df[,1]),FUN=length) 

, заменить length любой другой функцией, которая работает с векторами.Вы можете указать более одного фактора в list, тогда он будет делать это для каждой комбинации факторов.

Разница с ave() заключается в том, что ave() дает вектор с длиной исходного кадра данных.aggregate() возвращает фрейм данных, где одна переменная является индикатором группы.tapply() возвращает вектор с длиной, равной количеству групп.ddply() возвращает фрейм данных с переменной для каждого указанного фактора.

Конструкция by() особенно полезна, если вам нужно выполнять операции над несколькими столбцами, поскольку в основном это цикл по фреймам данных.Возвращает список, который можно преобразовать с помощью конструкции Шейна или напрямую используя matrix() или rbind().Это дает каждый раз несколько иную структуру, но все они полезны.

В зависимости от формата, который вы хотите получить, вы можете выбрать одну из этих возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...