Możesz dodać kolumnę do swoich danych przy użyciu różnych technik. Poniższe cytaty pochodzą z sekcji „Szczegóły” odpowiedniej pomocy tekstu [[.data.frame
.
Ramki danych mogą być indeksowane w kilku trybach. Gdy [
i [[
są używane z pojedynczym indeksem wektora ( x[i]
lub x[[i]]
), indeksują ramkę danych tak, jakby była listą.
my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector
Metoda data.frame dla $
, traktuje x
jako listę
my.dataframe$new.col <- a.vector
Kiedy [
i [[
są używane z dwoma indeksami ( x[i, j]
i x[[i, j]]
), działają jak indeksowanie macierzy
my.dataframe[ , "new.col"] <- a.vector
Ponieważ metoda dla data.frame
zakłada, że jeśli nie określisz, czy pracujesz z kolumnami czy wierszami, przyjmie ona, że masz na myśli kolumny.
Na przykład to powinno działać:
# 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
Łatwo: Twoja ramka danych to A
Następnie otrzymasz kolumnę b.
źródło
cumsum(b) -> b
wynikiem, zostałby bezpośrednio dodany jako kolumna do oryginalnej ramki danych, coś w rodzajuA$groups <- cumsum(b)
.cumsum(b)
poda wektor o długości 3, czy czegoś mi brakuje?your.df
danych, możesz po prostu zrobić,your.df$group = cumsum(your.df[, 1]==1)
aby uzyskać nową kolumnę grupy.Jeśli dobrze rozumiem pytanie, chcesz wykryć, kiedy
h_no
nie wzrasta, a następnie zwiększyćclass
. (Zamierzam przejść przez, jak rozwiązałem ten problem, na końcu jest niezależna funkcja.)Pracujący
Na razie zależy nam tylko na
h_no
kolumnie, więc możemy ją wyodrębnić z ramki danych:Chcemy wykryć, kiedy
h_no
nie rośnie, co możemy zrobić, obliczając, kiedy różnica między kolejnymi elementami jest ujemna lub zerowa. R zapewniadiff
funkcję, która daje nam wektor różnic:Gdy już to zrobimy, łatwo jest znaleźć te, które nie są pozytywne:
W R
TRUE
iFALSE
są w zasadzie takie same jak1
i0
, więc jeśli otrzymamy skumulowaną sumęnonpos
, wzrośnie o 1 w (prawie) odpowiednich miejscach.cumsum
Funkcja (który jest w zasadzie przeciwieństwemdiff
) może to zrobić.Ale są dwa problemy: liczby są o jeden za małe; i brakuje nam pierwszego elementu (w pierwszej klasie powinny być cztery).
Pierwszym problemem jest po prostu rozwiązany:
1+cumsum(nonpos)
. A drugi wymaga tylko dodania a1
na początku wektora, ponieważ pierwszy element jest zawsze w klasie1
:Teraz możemy dołączyć go z powrotem do naszej ramki danych za pomocą
cbind
(używającclass=
składni, możemy nadać kolumnieclass
nagłówek):A
data_w_classes
teraz zawiera wynik.Ostateczny wynik
Możemy skompresować linie razem i zawinąć je w funkcję, aby była łatwiejsza w użyciu:
Lub, ponieważ ma sens,
class
aby był czynnikiem:Używasz dowolnej funkcji, takiej jak:
(Ta metoda rozwiązania tego problemu jest dobra, ponieważ unika jawnej iteracji, która jest ogólnie zalecana dla R, i unika generowania wielu wektorów pośrednich i list itp. A także całkiem fajne, jak można to zapisać w jednej linii :))
źródło
Oprócz odpowiedzi Romana, coś takiego może być jeszcze prostsze. Zauważ, że nie testowałem tego, ponieważ nie mam teraz dostępu do R.
Funkcja iteruje po wartościach w
n_ho
i zawsze zwraca kategorię, do której należy bieżąca wartość. Jeśli1
zostanie wykryta wartość , zwiększamy zmienną globalnąindex
i kontynuujemy.źródło
Uważam, że użycie „cbind” jest najprostszym sposobem dodania kolumny do ramki danych w R. Poniżej przykład:
źródło
źródło
Podejście oparte na identyfikowaniu liczbę grup (
x
wmapply
) do jego długości (y
wmapply
)źródło