2017-09-03 6 views
0

을 내가 벡터 사용하고자하는피벗 테이블 R

time<-c(1,1,1,1,5,5,5) 
value<-c("s","s","s","t","d","d","d") 
dat1<- as.data.frame(cbind(time,value)) 

는 다음과 같은 벡터를 생성하기를, 그런 다음 첫 번째 벡터 "time.int"에 두 번째 데이터베이스에 추가 할 수 있습니다.

freq<-c(4,0,0,0,3) #wished result 

이 벡터는 각각의 시간 간격에 속하는 이벤트들의 합, 첫 번째 값 등등과 네를 얻을 수 있도록 "시간"네 1있다.

잠재적으로 나는 간격을 결정할 수 있도록 일반화하고 싶습니다. 예를 들어, 새로운 벡터의 합계를 "시간"의 각 시간 수 인 3 개의 숫자로 나타낼 수 있습니다. 일반화

편집

time.int<-c(1,2,3,4,5,6) 
time<-c(1,1,1,2,5,5,5,6) 
value<-c("s","s","s","t", "t","d","d","d") 
dat1<- data.frame(time,value) 

의 내가

freq<-c(4,0,4) #wished result 

또는 매 3

freq<-c(4,4) #wished result 

내가 방법을 알고 그것을 매 2 초 (매 2 time.int) 원하는 가정 해 봅시다 피벗 테이블을 사용하여 탁월한 작업을 수행하십시오.

죄송합니다.이 웹 사이트에서 맞는 질문을 찾을 수없는 경우이 질문과 시작 위치를 모르겠습니다.

답변

4

다음은 벡터 freq을 생성합니다.

freq <- sapply(time.int, function(x) sum(x == time)) 
freq 
[1] 4 0 0 0 3 

참고 : 구성 문자는 as.data.frame(cbind(.))입니다. 어떤 길이의 time.int의 세그먼트 위의 코드를 일반화하기 위해 대신

dat1 <- data.frame(time,value)) 

사용하여, 나는 다음과 같은 기능을 할 것으로 판단된다. 데이터를 변경 했으므로 n == 1에 대한 출력은 위와 같지 않습니다.

fun <- function(x, y, n){ 
    inx <- lapply(seq_len(length(x) %/% n), function(m) seq_len(n) + n*(m - 1)) 
    sapply(inx, function(i) sum(y %in% x[i])) 
} 

freq1 <- fun(time.int, time, 1) 
freq1 
[1] 3 1 0 0 3 1 

freq2 <- fun(time.int, time, 2) 
freq2 
[1] 4 0 4 

freq3 <- fun(time.int, time, 3) 
freq3 
[1] 4 4 
+0

브릴리언트! 그리고 일반화하고 싶다면? 새 벡터에서 합계를 말할 수 있으려면 "시간"에있는 이벤트가 각각 1 x 1 대신 3 시간의 time.int? –

+0

@havefun 아마도 여러분은 중첩 된'sapply'로 그것을 할 수있을 것입니다. 그러나 여러분은 여러분의 질문을 편집하고 예상되는 출력이 무엇인지 말할 필요가 있습니다. –

+0

이제 질문을 편집했습니다. 처음에는 매개 변수를 선택하고이를 사용하여 벡터를 나누고 싶습니다. –

1

우리는 이벤트의 수를 계산하기 위해 table 기능을 사용하여 정보를 요약 한 데이터 프레임을 만들 merge를 사용할 수 있습니다. event_dat이 최종 출력입니다.

# Create example data 
time.int <- c(1,2,3,4,5) 
time <- c(1,1,1,1,5,5,5) 

# Count the event using table and convert to a data frame 
event <- as.data.frame(table(time)) 

# Convert the time.int to a data frame 
time_dat <- data.frame(time = time.int) 

# Merge the data 
event_dat <- merge(time_dat, event, by = "time", all = TRUE) 

# Replace NA with 0 
event_dat[is.na(event_dat)] <- 0 

# See the result 
event_dat 
    time Freq 
1 1 4 
2 2 0 
3 3 0 
4 4 0 
5 5 3