#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