Вы можете добавить столбец к своим данным, используя различные методы. Приведенные ниже цитаты взяты из раздела «Подробности» соответствующего справочного текста [[.data.frame
.
Фреймы данных можно индексировать в нескольких режимах. Когда [
и [[
используются с одним векторным индексом ( x[i]
или x[[i]]
), они индексируют фрейм данных, как если бы он был списком.
my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector
Метод data.frame для $
, рассматривается x
как список
my.dataframe$new.col <- a.vector
Когда [
и [[
используются с двумя индексами ( x[i, j]
и x[[i, j]]
), они действуют как индексация матрицы
my.dataframe[ , "new.col"] <- a.vector
Поскольку метод для data.frame
предполагает, что если вы не укажете, работаете ли вы со столбцами или строками, он будет считать, что вы имеете в виду столбцы.
Для вашего примера это должно работать:
# make some fake data
your.df <- data.frame(no = c(1:4, 1:7, 1:5), h_freq = runif(16), h_freqsq = runif(16))
# find where one appears and
from <- which(your.df$no == 1)
to <- c((from-1)[-1], nrow(your.df)) # up to which point the sequence runs
# generate a sequence (len) and based on its length, repeat a consecutive number len times
get.seq <- mapply(from, to, 1:length(from), FUN = function(x, y, z) {
len <- length(seq(from = x[1], to = y[1]))
return(rep(z, times = len))
})
# when we unlist, we get a vector
your.df$group <- unlist(get.seq)
# and append it to your original data.frame. since this is
# designating a group, it makes sense to make it a factor
your.df$group <- as.factor(your.df$group)
no h_freq h_freqsq group
1 1 0.40998238 0.06463876 1
2 2 0.98086928 0.33093795 1
3 3 0.28908651 0.74077119 1
4 4 0.10476768 0.56784786 1
5 1 0.75478995 0.60479945 2
6 2 0.26974011 0.95231761 2
7 3 0.53676266 0.74370154 2
8 4 0.99784066 0.37499294 2
9 5 0.89771767 0.83467805 2
10 6 0.05363139 0.32066178 2
11 7 0.71741529 0.84572717 2
12 1 0.10654430 0.32917711 3
13 2 0.41971959 0.87155514 3
14 3 0.32432646 0.65789294 3
15 4 0.77896780 0.27599187 3
16 5 0.06100008 0.55399326 3
Легко: ваш фрейм данных - A
Тогда вы получите столбец b.
источник
cumsum(b) -> b
результат был напрямую добавлен в качестве столбца к исходному фрейму данных, что-то вродеA$groups <- cumsum(b)
.cumsum(b)
даст вам вектор длины 3, или я что-то упустил?your.df
данные, вы можете просто сделать,your.df$group = cumsum(your.df[, 1]==1)
чтобы получить новый столбец группы.Если я правильно понимаю вопрос, вы хотите определить, когда
h_no
не увеличивается, а затем увеличиватьclass
. (Я расскажу, как я решил эту проблему, в конце есть автономная функция.)Работает
На данный момент нас интересует только
h_no
столбец, поэтому мы можем извлечь его из фрейма данных:Мы хотим определить, когда
h_no
не повышается, что мы можем сделать, определив, когда разница между последовательными элементами либо отрицательна, либо равна нулю. R предоставляетdiff
функцию, которая дает нам вектор различий:Как только мы его получим, легко будет найти те, которые не являются положительными:
В R
TRUE
иFALSE
в основном такие же, как1
и0
, поэтому, если мы получим кумулятивную суммуnonpos
, она увеличится на 1 (почти) в соответствующих местах.cumsum
Функция (которая в основном противоположностьdiff
) может это сделать.Но есть две проблемы: числа слишком малы; и нам не хватает первого элемента (в первом классе должно быть четыре).
Первая проблема решается просто:
1+cumsum(nonpos)
. А для второго просто требуется добавить1
перед вектором, поскольку первый элемент всегда находится в классе1
:Теперь мы можем прикрепить его обратно к нашему фрейму данных с помощью
cbind
(используяclass=
синтаксис, мы можем присвоить столбцуclass
заголовок):А
data_w_classes
теперь содержит результат.Конечный результат
Мы можем сжать строки вместе и обернуть все это в функцию, чтобы упростить использование:
Или, поскольку имеет смысл
class
быть фактором:Вы используете любую функцию, например:
(Этот метод решения этой проблемы хорош, потому что он избегает явной итерации, которая обычно рекомендуется для R, и избегает генерации множества промежуточных векторов и списка и т. Д. И также вроде изящно, как это может быть написано в одной строке :))
источник
В дополнение к ответу Романа что-то вроде этого могло быть еще проще. Обратите внимание, что я не тестировал его, потому что сейчас у меня нет доступа к R.
Функция перебирает значения
n_ho
и всегда возвращает категорию, к которой принадлежит текущее значение. Если обнаружено значение1
, мы увеличиваем глобальную переменнуюindex
и продолжаем.источник
Я считаю, что использование cbind - это самый простой способ добавить столбец во фрейм данных в R. Пример ниже:
источник
источник
Подход, основанный на определении количества групп (
x
дюймовmapply
) и их длины (y
дюймовmapply
)источник