Как мне посчитать строки в соответствии с критериями и сохранить их как вектор?

#r #count #criteria

#r #подсчитать #критерии

Вопрос:

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

 c1 = c(1, 2, 3, 1, 3, 1)
 

Теперь я хочу знать, сколько раз c1 == 1, c1 == 2 и так далее.
Итак, мой результат для нового вектора должен быть

 c2 = c(3, 1, 2, 3, 2, 3)
 

Кто-нибудь может помочь? : D И, пожалуйста, объясните как можно проще, я довольно новичок в этом: D

Thaaanks

Комментарии:

1. Где ваш фрейм данных?

2. Для вашего примера это сработает: table(c1)[c1]

Ответ №1:

Попробуйте ave

 > ave(c1,c1,FUN = length)
[1] 3 1 2 3 2 3
 

Ответ №2:

Мы можем использовать table

 table(c1)[c1]
 

Или с помощью data.table

 library(data.table)
data.table(c1)[, c2 := .N, c1]$c2
#[1] 3 1 2 3 2 3
 

Ответ №3:

Одним из вариантов может быть:

 with(rle(sort(c1)), lengths[match(c1, values)])

[1] 3 1 2 3 2 3
 

Ответ №4:

Вы можете сделать:

 as.numeric(table(c1)[match(c1, names(table(c1)))])
#> [1] 3 1 2 3 2 3
 

Чтобы немного объяснить это (и безвозмездно использовать новую функцию таблицы SO), если мы начнем с table(c1) того, что получим:

1 2 3
3 1 2

Который сообщает нам, сколько из каждого числа появляется в векторе.

Если мы это сделаем names(table) , мы просто получим 1, 2, 3 из заголовка таблицы в виде вектора. Это означает, что мы можем сопоставить каждый элемент нашего исходного вектора с одним из столбцов этой таблицы, выполнив match(c1, names(table(c1))) . Это даст нам для каждого элемента c1 столбец таблицы, который мы хотим использовать в качестве подсчета для нашего нового вектора. Чтобы получить подсчеты по номерам столбцов, мы просто подмножествуем таблицу номерами столбцов, так table(c1)[match(c1, names(table(c1)))] что . Это дает нам наш ответ, но просто для того, чтобы все было чисто, мы удаляем отвлекающие имена столбцов из нашего результата с помощью as.numeric

Комментарии:

1. Большое вам спасибо, это сработало отлично!!

Ответ №5:

Это тоже вариант:

 as.numeric(table(c1)[as.character(c1)])

[1] 3 1 2 3 2 3