연속된 각 시퀀스에 대한 그룹 번호 생성
아래 data.frame을 가지고 있습니다.열에 연속된 시퀀스에 따라 데이터를 분류하는 열 'g'를 추가하고 싶습니다.h_no
즉, h_no의 첫 번째 수열1, 2, 3, 4
그룹 1, 두 번째 시리즈h_no
(1 ~ 7)은 마지막 열 'g'에 표시된 바와 같이 그룹 2입니다.
h_no h_freq h_freqsq g
1 0.09091 0.008264628 1
2 0.00000 0.000000000 1
3 0.04545 0.002065702 1
4 0.00000 0.000000000 1
1 0.13636 0.018594050 2
2 0.00000 0.000000000 2
3 0.00000 0.000000000 2
4 0.04545 0.002065702 2
5 0.31818 0.101238512 2
6 0.00000 0.000000000 2
7 0.50000 0.250000000 2
1 0.13636 0.018594050 3
2 0.09091 0.008264628 3
3 0.40909 0.167354628 3
4 0.04545 0.002065702 3
다양한 기법을 사용하여 데이터에 열을 추가할 수 있습니다.아래 인용문은 관련 도움말 텍스트의 "상세 정보" 섹션에서 가져온 것입니다.[[.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 <- A[,1]
b <- b==1
b <- cumsum(b)
그러면 열 b가 나옵니다.
만약 내가 질문을 올바르게 이해했다면, 당신은 언제가h_no
증가하지 않고 증가합니다.class
(이 문제를 해결한 방법을 살펴보겠습니다. 마지막에 자체 기능이 있습니다.)
일해
우리는 오직 그것만 신경씁니다.h_no
데이터 프레임에서 추출할 수 있도록 다음과 같은 열을 제공합니다.
> h_no <- data$h_no
우리는 언제인지 감지하고 싶습니다.h_no
연속적인 요소 간의 차이가 음수이거나 0일 때 계산함으로써 증가하지 않습니다.R은 차이의 벡터를 제공하는 함수를 제공합니다.
> d.h_no <- diff(h_no)
> d.h_no
[1] 1 1 1 -3 1 1 1 1 1 1 -6 1 1 1
일단 우리가 그것을 갖게 되면, 긍정적이지 않은 것들을 찾는 것은 간단한 문제입니다.
> nonpos <- d.h_no <= 0
> nonpos
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[13] FALSE FALSE
R에서,TRUE
그리고.FALSE
기본적으로 와 동일합니다.1
그리고.0
그래서 만약 우리가 누적 합계를 얻는다면.nonpos
해당 지점에서 1만큼 증가합니다.함수(기본적으로 반대)diff
)이 할 수 있습니다.
> cumsum(nonpos)
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2
그러나 두 가지 문제가 있습니다. 숫자가 하나 너무 작습니다. 그리고 첫 번째 요소가 누락되었습니다(첫 번째 클래스에는 네 개가 있어야 합니다).
첫 번째 문제는 간단히 해결됩니다.1+cumsum(nonpos)
그리고 두 번째는 단지 추가하기만 하면 됩니다.1
첫 번째 요소가 항상 클래스에 있기 때문에 벡터의 앞쪽으로1
:
> classes <- c(1, 1 + cumsum(nonpos))
> classes
[1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3
이제 데이터 프레임에 데이터를 다시 연결할 수 있습니다.class=
구문, 우리는 열에 다음을 줄 수 있습니다.class
제목):
> data_w_classes <- cbind(data, class=classes)
그리고.data_w_classes
이제 결과가 포함됩니다.
최종 결과
선을 함께 압축하고 사용하기 쉽게 모든 것을 함수로 묶을 수 있습니다.
classify <- function(data) {
cbind(data, class=c(1, 1 + cumsum(diff(data$h_no) <= 0)))
}
는또에 이 되기 에, 이타당기때문에하그것▁or때에문.class
요인이 되는 것:
classify <- function(data) {
cbind(data, class=factor(c(1, 1 + cumsum(diff(data$h_no) <= 0))))
}
다음과 같은 기능 중 하나를 사용합니다.
> classified <- classify(data) # doesn't overwrite data
> data <- classify(data) # data now has the "class" column
(이 문제를 해결하는 방법은 일반적으로 R에 권장되는 명시적 반복을 피하고 많은 중간 벡터와 목록 등을 생성하지 않기 때문에 좋습니다.그리고 한 줄로 쓸 수 있는 방법도 깔끔합니다 :)
로만의 대답에 덧붙여, 이와 같은 것은 훨씬 더 간단할지도 모릅니다.현재 R에 접근할 수 없기 때문에 테스트하지 않았습니다.
# Note that I use a global variable here
# normally not advisable, but I liked the
# use here to make the code shorter
index <<- 0
new_column = sapply(df$h_no, function(x) {
if(x == 1) index = index + 1
return(index)
})
는 함는의값반다의 값을 합니다.n_ho
현재 값이 속하는 범주를 항상 반환합니다.값이 다음과 같은 경우1
감지되면 인 "감되면글변늘립니다를수벌로지▁the다늘니"를 시킵니다.index
계속합니다.
은 은좋선은입니다.collapse::seqid
연속된 숫자의 시퀀스에서 고유한 ID를 생성합니다.유연합니다.: 기능은매최고유되연니다합이화적우다▁the▁is.
collapse::seqid(df$h_no)
#[1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3
collapse::seqid(c(1:5, 7:10))
#[1] 1 1 1 1 1 2 2 2 2
collapse::seqid(c(1:5, 7:10), del = 2) #With a delimitation of 2
#[1] 1 2 3 4 5 5 6 7 8
collapse::seqid(c(1, NA, 2), na.skip = TRUE)
#[1] 1 NA 1
그룹 수 파악을 기반으로 한 접근 방식(x
mapply
및 그 () 및길이(길()y
mapply
)
mytb<-read.table(text="h_no h_freq h_freqsq group
1 0.09091 0.008264628 1
2 0.00000 0.000000000 1
3 0.04545 0.002065702 1
4 0.00000 0.000000000 1
1 0.13636 0.018594050 2
2 0.00000 0.000000000 2
3 0.00000 0.000000000 2
4 0.04545 0.002065702 2
5 0.31818 0.101238512 2
6 0.00000 0.000000000 2
7 0.50000 0.250000000 2
1 0.13636 0.018594050 3
2 0.09091 0.008264628 3
3 0.40909 0.167354628 3
4 0.04545 0.002065702 3", header=T, stringsAsFactors=F)
mytb$group<-NULL
positionsof1s<-grep(1,mytb$h_no)
mytb$newgroup<-unlist(mapply(function(x,y)
rep(x,y), # repeat x number y times
x= 1:length(positionsof1s), # x is 1 to number of nth group = g1:g3
y= c( diff(positionsof1s), # y is number of repeats of groups g1 to penultimate (g2) = 4, 7
nrow(mytb)- # this line and the following gives number of repeat for last group (g3)
(positionsof1s[length(positionsof1s )]-1 ) # number of rows - position of penultimate group (g2)
) ) )
mytb
저는 "cbind"를 사용하는 것이 R의 데이터 프레임에 열을 추가하는 가장 간단한 방법이라고 생각합니다.다음은 예입니다.
myDf = data.frame(index=seq(1,10,1), Val=seq(1,10,1))
newCol= seq(2,20,2)
myDf = cbind(myDf,newCol)
그data.table
rleid
이런 일에 유용합니다.▁sequence뺍다니▁the▁we의 순서를 뺍니다.1:nrow(data)
합니다.rleid
합니다. ID는 다음과 같이 하십시오.
data$g = data.table::rleid(data$h_no - 1:nrow(data))
Data.frame[,'h_new_column'] <- as.integer(Data.frame[,'h_no'], breaks=c(1, 4, 7))
언급URL : https://stackoverflow.com/questions/10150579/create-a-group-number-for-each-consecutive-sequence
'source' 카테고리의 다른 글
(다른 플랫폼에서) NDEBUG 전처리기 매크로는 무엇에 사용됩니까? (0) | 2023.06.14 |
---|---|
유형 스크립트에서 문자열 변수를 문자열 리터럴 유형으로 캐스트하는 방법 (0) | 2023.06.14 |
데이터, 방법 및 계산을 글로벌 가치로 만들려면 어떻게 해야 합니까? (0) | 2023.06.14 |
제공자 com.google을 가져올 수 없습니다.화력 기지파이어베이스Init 공급자 (0) | 2023.06.14 |
Python으로 Excel 외부 데이터 새로 고침 (0) | 2023.06.14 |