У меня есть кадр данных в R, который похож на следующий. На самом деле мой настоящий фрейм данных «df» намного больше, чем здесь, но я действительно не хочу никого смущать, поэтому я стараюсь максимально упростить ситуацию.
Итак, вот кадр данных.
id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3)
a <-c(3,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3)
b <-c(3,2,1,1,1,1,1,1,1,1,1,2,1,3,2,1,1,1,2,1,3,1,2,2,1,3,3,2,3,2)
c <-c(1,3,2,3,2,1,2,3,3,2,2,3,1,2,3,3,3,1,1,2,3,3,1,2,2,3,2,2,3,2)
d <-c(3,3,3,1,3,2,2,1,2,3,2,2,2,1,3,1,2,2,3,2,3,2,3,2,1,1,1,1,1,2)
e <-c(2,3,1,2,1,2,3,3,1,1,2,1,1,3,3,2,1,1,3,3,2,2,3,3,3,2,3,2,1,3)
df <-data.frame(id,a,b,c,d,e)
df
В основном то, что я хотел бы сделать, это получить вхождения чисел для каждого столбца (a, b, c, d, e) и для каждой группы идентификаторов (1,2,3) (для этой последней группы см. мой столбец 'id ').
Итак, для столбца «a» и для идентификатора «1» (для последнего см. столбец «id») код будет примерно таким:
as.numeric(table(df[1:10,2]))
##The results are:
[1] 3 7
Кратко поясню мои результаты: в столбце «a» (и в отношении только тех записей, у которых в столбце «id» есть число «1») мы можем сказать, что число «1» встречается 3 раза, а число «3» встречается 7 раз.
Опять же, просто чтобы показать вам еще один пример. Для столбца «a» и для идентификатора «2» (для последней группы см. снова столбец «id»):
as.numeric(table(df[11:20,2]))
##After running the codes the results are:
[1] 4 3 3
Позвольте мне еще раз немного объяснить: в столбце «а» и только в отношении тех наблюдений, которые имеют номер «2» в столбце «id»), мы можем сказать, что число «1» встречается 4 раза, число «2» встречается 3 раза и число «3» встречается 3 раза.
Вот что я хотел бы сделать. Вычисление вхождений чисел для каждого пользовательского подмножества (и затем сбор этих значений во фрейм данных). Я знаю, что это несложная задача, но ПРОБЛЕМА заключается в том, что мне придется регулярно менять входной фрейм данных «df», и, следовательно, общее количество строк и столбцов может меняться со временем…
Что я сделал до сих пор, так это то, что я разделил фрейм данных «df» по столбцам, например так:
for (z in (2:ncol(df))) assign(paste("df",z,sep="."),df[,z])
Таким образом, df.2 будет относиться к df$a, df.3 будет равно df$b, df.4 будет равно df$c и т. д. Но сейчас я действительно застрял и не знаю, как двигаться дальше…
Есть ли правильный, «автоматический» способ решить эту проблему?