방명록

  1. 꾸리꾸리 2019.05.22 17:37  수정/삭제  댓글쓰기

    확인번호를 확인 할 수 없어...부득이 하게 다시 글 남깁니다.

    1. Dataset은 7열 300,000행으로 구성되어 있습니다.
    2. A(ID) B(number)... 등으로 G 열까지 나누어져 있습니다.
    3. apple이라는 ID의 이름은 동일하지만 B, C, D ...이 값이 다르기 때문에 apple이라는 이름을 A열에서 이용할 수 있었습니다.
    ex)
    A B C D E F G
    apple a b c d e f
    apple b c d e f g
    banana c d e f g h
    apple d e f g h i j
    melon e f g h i j k
    apple f g h i j k l
    이런식으로 7행 300,000열이 구성되어 있습니다.

    4. 다시 예를 들면, A열은 1,2,3,4,5,ㄱ,ㄴ,ㄷ의 이름들로 300,000개의 행이 섞여 있습니다.
    5. 문제는 데이터를 처리를 위해 A열 (ID를 기준)을 기준삼아 처리를 하려 하는 도중 ㄱ,ㄴ,ㄷ 입니다. ㄱ->6 / ㄴ->7 / ㄷ->8 로 변경을 하려합니다.
    6. 전처리에 대한 글을 보며dimnames()를 이용하여 할 수 있지 않나 싶었으나, 동일한 이름으로 각각 나누어져 있는 행들을 한번에 변환하는 방법이 궁금합니다.

    • R Friend R_Friend 2019.05.22 17:53 신고  수정/삭제

      https://rfriend.tistory.com/235 의 mutate() 함수 & ifelse 조건문 같이 쓰는 예제 참고하셔서 새로운 열(column) 생성하면 되겠네요.

  2. 꾸리꾸리 2019.05.22 17:10  수정/삭제  댓글쓰기

    안녕하세요.
    전처리 과정 중 질문 드립니다.

    1. 7rows 300,000 col으로 구성된 데이터
    2. A B C D E F G 중 A열을 기준으로 보았을때, A열의 행의 구성은
    1행 ~ 20,000 col : apple
    20,000 ~ 50,000 col : banana
    ....
    ~ 300,000 col : melon
    3. 이중, apple이라는 모든 컬럼의 이름을 Water로 바꾸고자 할때,
    ( A열 내에 존재하는 apple이라는 이름의 컬럼의 이름을 바꾸고자 할때) 어떠한 방법으로 진행해야 할지 궁금합니다.

    4. 실제 데이터는 2번과 같이 나누어 되어있지 않고 부분적으로나누어져 있어 전처리를 어떻게 진행해야 하는지 모르겠습니다.

    • R Friend R_Friend 2019.05.22 17:22 신고  수정/삭제

      행(row)과 열(column) 표기가 좀 헷갈리는데요, 확인 부탁드립니다.

      그리고 apple 이라는 동일한 칼럼 이름이라고 하셨는데요, 칼럼 이름이 어떻게 동일할수가 있는지도 궁금합니다. 뒤에 postfix(예: apple_1, ... , apple_20000)로 구분하나요?

  3. 꾸리꾸리 2019.05.10 14:53  수정/삭제  댓글쓰기

    안녕하세요.
    데이터 분석 중 모르는 부분이 있어 질문 드립니다.

    A라는 데이터 프레임 ( 8열 5000행)

    A(sample id) B(value1) C(value1) D(value2) E(value3) F(value4) G(value5) H(value6) I(value7)

    B라는 데이터 프레임 ( 3열 10행)
    A(sample id) J(value1) K(value2)

    이중 A의 데이터 프레임과 B의 데이터 프레임의 sample id는 같고 values의 list만 다릅니다.

    진행하고자 하는 작업은

    B에 해당하는 sample id 를 A에서 찾아내서 A의 데이터프레임에 있는 value list를 전부 B의 데이터 프레임에 추가하는

    excel에도 함수를 이용하여 진행할 수 있는 작업이긴 하나, R에서도 이러한 필터링이 가능한지 궁금해서 질문 드립니다.

    • R Friend R_Friend 2019.05.10 15:17 신고  수정/삭제

      안녕하세요 꾸리꾸리님,

      엑셀의 vlookup, DB의 join 기능과 같은 것으로 R merge() 함수가 있습니다.

      merge(B, A, by='key') 를 사용하시면 됩니다. 아래 포스팅 참고하세요.

      https://rfriend.tistory.com/51

  4. HJ 2019.05.01 00:05  수정/삭제  댓글쓰기

    안녕하세요 !
    혹시 ㅠㅠ 실례가 되지 않는다면
    메타분석(CMA) 통계 의뢰도 받으시나요?

    석사논문 메타분석 연구중인데요!
    통계 의뢰 받으시는지 궁금합니다 ㅠㅠㅠㅠㅠ

  5. JY 2019.04.24 10:56  수정/삭제  댓글쓰기

    혼자 R 공부하느라 어려움이 많았는데 자세하고 친절한 포스팅에 도움 많이 얻고 갑니다. 감사합니다! 좋은 하루 되세요. :)

  6. SM 2019.04.22 11:33  수정/삭제  댓글쓰기

    선생님 안녕하세요!!
    제가 난괴법을 해보고 싶어서 코드를 해봤는데,, 이렇게하면 될까용?..
    완전임의배치법하고도 차이를 보고자 해봤습니다. - CV값을 차이를 보고싶어서 했습니다.

    데이터는 다음과같습니다.
    > ex
    treat block obs
    1 a 1 2.9
    2 a 2 2.0
    3 a 3 3.8
    4 b 1 5.5
    5 b 2 4.6
    6 b 3 4.5
    7 c 1 4.7
    8 c 2 3.5
    9 c 3 6.9
    10 d 1 21.2
    11 d 2 23.2
    12 d 3 28.7
    > outa=aov(obs~treat+block, data=ex)
    > summary(outa)
    Df Sum Sq Mean Sq F value Pr(>F)
    treat 3 917.5 305.82 79.820 8.89e-06 ***
    block 1 11.5 11.52 3.007 0.127
    Residuals 7 26.8 3.83
    ---
    Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    > library(agricolae)
    > duncan=duncan.test(outa,"treat",group=T)
    > duncan
    $statistics
    MSerror Df Mean CV
    3.831429 7 9.291667 21.06623

    $parameters
    test name.t ntr alpha
    Duncan treat 4 0.05

    $duncan
    Table CriticalRange
    2 3.344084 3.779174
    3 3.477157 3.929561
    4 3.548253 4.009908

    $means
    obs std r Min Max Q25 Q50 Q75
    a 2.900000 0.9000000 3 2.0 3.8 2.45 2.9 3.35
    b 4.866667 0.5507571 3 4.5 5.5 4.55 4.6 5.05
    c 5.033333 1.7243356 3 3.5 6.9 4.10 4.7 5.80
    d 24.366667 3.8837267 3 21.2 28.7 22.20 23.2 25.95

    $comparison
    NULL

    $groups
    obs groups
    d 24.366667 a
    c 5.033333 b
    b 4.866667 b
    a 2.900000 b

    attr(,"class")
    [1] "group"

    • R Friend R_Friend 2019.04.24 10:28 신고  수정/삭제

      안녕하세요 SM님,
      답변이 늦어져서 죄송합니다.

      두번째의 'block' 변수를 요인형 (factor type)으로 변환 후에 분석을 진행하시기 바랍니다.

      treat <- c(rep("a", 3), rep("b", 3), rep("c", 3), rep("d", 3))
      block <- c(rep(1:3, 4))
      block.fac <- as.factor(block)
      obs <- c(2.9, 2.0, 3.8, 5.5, 4.6, 4.5, 4.7, 3.5, 6.9, 21.2, 23.2, 28.7)

      ex.2 <- data.frame(treat, block.fac, obs)
      str(ex.2)

      outa2 <- aov(obs~treat+block.fac, data=ex.2)
      summary(outa2)


      install.packages("agricolae")
      library(agricolae)

      duncan2=duncan.test(outa2,"treat",group=T)
      duncan2

    • SM 2019.04.26 12:58  수정/삭제

      outa=aov(obs~treat+block) 이렇게 마무리하면 이게 완전임의배치법이 되는건가욥?

    • R Friend R_Friend 2019.04.27 22:59 신고  수정/삭제

      (1) 완전임의배치법(Completely Randomized Design) 은 aov(obs~factor(treat), data=ex) 이구요,

      (2) 난괴법(Randomized Block Design)은 block에 해당하는 요인이 추가가 되어 aov(obs~factor(treat)+factor(block), data=ex) 입니다.

  7. 이상규 2019.04.19 11:14  수정/삭제  댓글쓰기

    안녕하세요!! 선생님 작년에 제가 MLE 구하는 방법을 배워갔습니다.
    덕분에 문제를 잘 해결했는데 ㅜㅜ 이번에는 지정값을 구하는 방법을 찾고있는데 해결이 너무 어려워서 또 찾아왔습니다 ㅜㅜ!

    데이터는

    x = seq(-5, 5, 0.1)
    normal = dnorm(x, mean, sd)
    pos = 1- exp(-10^x * 25)
    y = normal * pos

    k = sum(y)

    인데 k 값이 0.0073이 나오게하는 mean, sd값을 구하고 싶습니다..

    multiroot 함수 등 방법을 계속 찾고 있는데.. 쉽지 않습니다..
    도와주세요ㅠㅠ!

    • 이상규 2019.04.19 11:24  수정/삭제

      mean 값은 -9부터 9사이 값이라는 조건이 들어가있습니다..!!

    • R Friend R_Friend 2019.04.20 00:35 신고  수정/삭제

      sd에 대한 조건은 없는지요?

    • R Friend R_Friend 2019.04.20 00:54 신고  수정/삭제

      grid search 하는 방법으로 코드 짜봤습니다. 3D scatter plot 보시면 mean과 sd별 k 값 보면서 관계를 이해하는데 도움이 될 것입니다.

      # set parameter range
      x <- seq(-5, 5, 0.1)
      mean <- seq(-9, 9, 0.1)
      sd <- seq(0.1, 3, 0.1)
      target <- 0.0073

      # blank dataframe
      df_k <- data.frame()

      # calculation of k by grid search
      for (m in 1:length(mean)){
      for (s in 1:length(sd)){
      mean_m = mean[m]
      sd_s = sd[s]
      normal = dnorm(x, mean_m, sd_s)
      pos = 1- exp(-10^x * 25)
      y = normal * pos

      k = sum(y)

      gap = k - target

      df_k_tmp = data.frame(mean_m, sd_s, k, gap)
      df_k <- rbind(df_k, df_k_tmp)
      }
      }

      # 3D Scatter Plot
      #install.packages("scatterplot3d")
      library(scatterplot3d)
      x_mean <- df_k$mean_m
      y_sd <- df_k$sd_s
      z_k <- df_k$k
      z_gap <- df_k$gap

      k_3d <- scatterplot3d(x_mean, y_sd, z_k,
      type = "h",
      pch = 16,
      scale.y = 0.7,
      highlight.3d = TRUE,
      box = TRUE,
      col.axis = "blue",
      grid = TRUE,
      mar = c(3, 4, 4, 3),
      xlab = "mean",
      ylab = "sd",
      zlab = "k",
      main = "3D scatter plot of mean, sd and k")

      gap_3d <- scatterplot3d(x_mean, y_sd, z_gap,
      type = "h",
      pch = 16,
      scale.y = 0.7,
      highlight.3d = TRUE,
      box = TRUE,
      col.axis = "blue",
      grid = TRUE,
      mar = c(3, 4, 4, 3),
      xlab = "mean",
      ylab = "sd",
      zlab = "gap",
      main = "3D scatter plot of mean, sd and gap")


      # Indexing
      df_k[which(gap == min(abs(gap))),]

  8. Monsieur CHA 2019.03.26 00:26 신고  수정/삭제  댓글쓰기

    선생님 안녕하세요?

    제가 또 질문이 있어서 이렇게 글을 쓰게 되었네요.
    매번 귀찮게 해드려 죄송합니다.

    표에서
    no name vowel t1 t2 t3 t4 t5 t6 f2_1 f2_2 f2_3 f2_4 f2_5 f2_6
    1 a xi 0.1 0.2 0.3 0.7 0.9 0.10 100 150 170 160 180 200
    2 b xi 0.1 0.3 0.5 0.8 0.9 0.10 100 140 170 160 180 200


    이런 표가 있다고하면
    t3-t1, t(n+2)-t(n)... 의 값이 0.2(>=0.2)보다 크거나 같고,
    f2_3-f2_1, f2_(n+2)-f(n) 의 값이 20(<20)보다 작은 수를 구하고
    결과값으로 마지막 f2(n+2)와 t(n+2)의 값을 각 name 마다 구한다고 한다면,
    예를 들어서
    name a에서 만족하는 결과값으로 t1=0.1, f2_1=100(처음 기준값), t4=0.7, f2_4 = 160 이런 결과 값을 구하고 싶다면 R에서 어떤 식으로 코딩을 해야할까요?
    그러면 답변 기다리겠습니다.
    좋은 하루되세요.

    • R Friend R_Friend 2019.03.27 00:59 신고  수정/삭제

      안녕하세요 Monsieur CHA님,
      아래 코드 참고하시기 바랍니다.
      2중 for loop 문에 if 조건절 합친 코드입니다.

      > # input data
      > no <- c(1:3)
      > name <- c('a', 'b', 'c')
      > vowel <- c(rep('xi', 3))
      > t1 <- c(0.1, 0.1, 0.1)
      > t2 <- c(0.2, 0.3, 0.2)
      > t3 <- c(0.3, 0.5, 0.4)
      > t4 <- c(0.4, 0.8, 0.3)
      > t5 <- c(0.9, 0.9, 0.4)
      > t6 <- c(0.1, 0.1, 0.5)
      > f2_1 <- c(100, 100, 100)
      > f2_2 <- c(150, 140, 100)
      > f2_3 <- c(170, 170, 110)
      > f2_4 <- c(160, 160, 150)
      > f2_5 <- c(180, 180, 190)
      > f2_6 <- c(200, 200, 160)
      >
      > df <- data.frame(no, name, vowel, t1, t2, t3, t4, t5, t6, f2_1, f2_2, f2_3, f2_4, f2_5, f2_6)
      > df
      no name vowel t1 t2 t3 t4 t5 t6 f2_1 f2_2 f2_3 f2_4 f2_5 f2_6
      1 1 a xi 0.1 0.2 0.3 0.4 0.9 0.1 100 150 170 160 180 200
      2 2 b xi 0.1 0.3 0.5 0.8 0.9 0.1 100 140 170 160 180 200
      3 3 c xi 0.1 0.2 0.4 0.3 0.4 0.5 100 100 110 150 190 160
      >
      > # blank DataFrame
      > df_selected <- data.frame()
      >
      > # for loop statement with 'AND' conditions
      > for (i in 1:nrow(df)) {
      + for (j in 4:7) {
      +
      + # progress check
      + print(paste0(i, ' : ', j))
      +
      + if (df[i, (j+2)] - df[i, j] >= 0.2 & df[i, (j+6+2)] - df[i, (j+6)] < 20) {
      + name <- df[i, 'name']
      + t_n_2 <- df[i, (j+2)]
      + f2_n_2 <- df[i, (j+6+2)]
      + df_tmp <- data.frame(name, t_n_2, f2_n_2)
      +
      + # append df_tmp to df_selected
      + df_selected <- rbind(df_selected, df_tmp)
      +
      + }
      + }
      + }
      [1] "1 : 4"
      [1] "1 : 5"
      [1] "1 : 6"
      [1] "1 : 7"
      [1] "2 : 4"
      [1] "2 : 5"
      [1] "2 : 6"
      [1] "2 : 7"
      [1] "3 : 4"
      [1] "3 : 5"
      [1] "3 : 6"
      [1] "3 : 7"
      >
      > print(df_selected)
      name t_n_2 f2_n_2
      1 a 0.4 160
      2 a 0.9 180
      3 b 0.9 180
      4 c 0.4 110
      5 c 0.5 160

  9. JINSN 2019.03.24 01:47  수정/삭제  댓글쓰기

    안녕하세요? 다름이 아니라 제가 궁금한게 있어서요.
    선생님께서 작성하신 여러 파일을 열고 하나의 파일로 합치는 for loop에 대해서 확인해보고 응용을 해보고자 하는데 어떻게 할지 몰라서요.

    여러파일을 반복적으로 부르고 하나의 파일로 합치기 전에
    하나의 세로 축을 넣을 넣고 그 세로 축의 값에는 파일의 이름을 넣고 싶어요.
    예를 들어서, 1번이라는 파일을 열 경우 아래와 같은 표가 나온다고 가정하면,
    시간 요일 장소
    1시 월 집
    2시 화 학교

    여기서 '파일'이라는 축을 넣고, 파일 축에 해당파일 이름이 들어가는 for loop를 만들고 싶어요.(1번 파일을 연경우 1이라는 제목이 입력되고, 2번 파일을 연 경우 2가 출력되는).

    파일 시간 요일 장소
    1 1시 월 집
    1 2시 화 학교
    2 1시 월 집
    2 2시 목 학원

    이럴 경우 선생님께서 올려주신 for loop에서 어떻게 해야할까요?
    그러면 오늘도 좋은 하루 되세요 ^^

    a1 <- c("C:/Users/Desktop/1")
    a2 <- list.files(a1)
    a3 <- length(a2)


    for(i in 1:a3){
    a4<- read.table(paste(a1, "/", a2[i], sep=""),
    sep = "\t", header = FALSE, stringsAsFactors = FALSE)
    write.table(a4, paste(xi1, "/", "a_all.txt", sep=""),
    sep = "\t",
    row.names = FALSE,
    col.names = FALSE,
    quote = FALSE,
    append = TRUE)
    print(i)
    }

    • R Friend R_Friend 2019.03.24 13:29 신고  수정/삭제

      안녕하세요 JINSU 님,

      아래의 코드를 참고해서 실행해보시기 바랍니다.

      a4_filenum <- data.frame(i, a4)
      를 추가하고, a4_filenum DataFrame을 내보내기하였습니다.

      #----------------------
      a1 <- c("C:/Users/Desktop/1")
      a2 <- list.files(a1)
      a3 <- length(a2)


      for(i in 1:a3){
      a4 <- read.table(paste(a1, "/", a2[i], sep=""),
      sep = "\t", header = FALSE, stringsAsFactors = FALSE)

      # adding file number 'i' to 'a4'
      a4_filenum <- data.frame(i, a4)

      write.table(a4_filenum, paste(xi1, "/", "a_all.txt", sep=""),
      sep = "\t",
      row.names = FALSE,
      col.names = FALSE,
      quote = FALSE,
      append = TRUE)

      print(i)
      }

    • JINSN 2019.03.24 16:33  수정/삭제

      안녕하세요 보내주신 코딩으로 해봤는데 이렇게 에러 메세지가 뜨는데요 어떻게 해야할까요? ㅠㅠ
      > for(i in 1:a3){
      + a4<- read.table(paste(a1, "/", a2[i], sep=""),
      + sep = "\t", header = FALSE, stringsAsFactors = FALSE)
      + a4_filenum <- data.frame(i, a4)
      + write.table(a4, paste(a1, "/", "a_all.txt", sep=""),
      + sep = "\t",
      + row.names = FALSE,
      + col.names = FALSE,
      + quote = FALSE,
      + append = TRUE)
      + print(i)
      + }
      [1] 1
      [1] 2
      [1] 3
      [1] 4
      Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, numerals = numerals, :
      invalid multibyte string at '<fe><ff>'
      In addition: Warning messages:
      1: In read.table(paste(a1, "/", a2[i], sep = ""), sep = "\t", header = FALSE, :
      line 1 appears to contain embedded nulls
      2: In read.table(paste(a1, "/", a2[i], sep = ""), sep = "\t", header = FALSE, :
      line 2 appears to contain embedded nulls
      3: In read.table(paste(a1, "/", a2[i], sep = ""), sep = "\t", header = FALSE, :
      line 3 appears to contain embedded nulls
      4: In read.table(paste(a1, "/", a2[i], sep = ""), sep = "\t", header = FALSE, :
      line 4 appears to contain embedded nulls
      5: In read.table(paste(a1, "/", a2[i], sep = ""), sep = "\t", header = FALSE, :
      line 5 appears to contain embedded nulls
      6: In scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
      embedded nul(s) found in input

    • R Friend R_Friend 2019.03.24 16:39 신고  수정/삭제

      write.table(a4_filenum, ...)으로 해보세요. (지금은 write.table(a4,...)로 해놓으심). 기존 txt 파일 먼저 삭제하시구요.

    • JINSN 2019.03.24 16:56  수정/삭제

      감사해요, 잘 해결되었어요 ^^ 좋은 하루되세요^^

  10. Monsieur CHA 2019.03.23 02:23 신고  수정/삭제  댓글쓰기

    안녕하세요?
    저는 현재 프랑스 파리에서 음성학을 공부하고 있는 석사생입니다.

    통계수업시간에 이 사이트를 알게 되었고,
    이 사이트 덕분에 R에 대해서 많이 배우고, 학교 수업에서 좋은 성적을 거두었습니다.
    먼저 감사 인사를 드립니다.

    다름 아니라, 제가 현재 논문을 쓰기 위하여 R프로그램으로 작업을 진행중에 있습니다.
    제가 반복 계산을 통하여, 값을 구하고자하는데,
    아무리 제 머리 속에서 공식을 짜봐도 답이 나오지 않아 이렇게 글을 쓰게 되었습니다.
    function을 만들려하는데요
    for 함수와 if 함수로 시도해보았지만
    잘 되지 않아 답답한 마음에 이렇게 글을 남기게 되었습니다.

    제가 현재 아래와 같은 구조로 표를 구성하였는데요,
    no interval vowel time f1 f2 f3
    1 i1 xi 0 191 1110 2439
    2 i1 xi 0.01 191 1115 2439
    3 i1 xi 0.02 191 1140 2440
    4 i1 xi 0.03 191 1145
    *
    10 i2 xi 0 200 1200 3333
    11 i2 xi 0.01 200 1220 3333
    12 i2 xi 0.02 200 1230 3333
    13 i2 xi 0.03 200 1235 3333

    * vowel 에는 xi i e 등등 존재
    위와 같은 표를 구성하여
    vowel는 xi만 선택하고 각 interval (i1, i2... etc)에서 f2(n+2)-f2(n)의 f2 값의 차가 20이상일때는 진행되고 f2값의 차가 20미만 일 때 멈추서 (n+2)와 n의 값 사이의 no. time, f2을 구하고자합니다.

    예시로, i2에서 10번과 12번의 f2 차이 (1230-1210 = 20)가 20이상이므로 진행되고, 11번과 13번의 f2 값의 차이 (1235-1220=15)가 20미만이라서 멈추고, 그 사이의 no : 12, time : 0.02, f2 : 1230 값을 표시해주는
    function을 만들고 싶은데, 어떻게 해야할지 막막하여 이렇게 글을 남기게 되었습니다.
    실례가 되지 않으시다면, 제가 하고자 하는 것이 구현가능한지 알고 싶고,
    또, function에 대한 예시를 알려주실 수 있을지 몰라 이렇게 글을 남기게 되었습니다.
    좋은 주말되시고, 답변 기다리겠습니다.
    감사합니다.

    • R Friend R_Friend 2019.03.23 18:10 신고  수정/삭제

      안녕하세요 Monsieur CHA님, 유학 중이신데 블로그 통해서 만나게 되서 반갑습니다.

      블로그가 도움이 되었다니 기쁘네요.

      남겨주신 글 기반으로 예제 데이터셋 만들어서 코드 짜보았습니다. 한번 실행해보시고 원하시는 결과가 잘 나오는지 확인해보시기 바랍니다.

      ps. RStudio에서 짜놓은 것을 블로그에 붙여넣기를 하면 '들여쓰기(indentation)'가 없어지고. 코드가 모두 왼쪽으로 붙어버리네요. RStudio 나 다른 IDE로 코드를 옮겨놓고 보시면 됩니다.

      > # input data
      > no <- c(1:12)
      > interval <- c(rep('i1', 6), rep('i2', 6))
      > vowel <- c(rep('xi', 12))
      > time <- c(rep(c(0, 0.01, 0.02, 0.03, 0.04, 0.05), 2))
      > f1 <- c(rep(191, 6), rep(200, 6))
      > f2 <- c(1110, 1115, 1140, 1145, 1150, 1155, 1200, 1220, 1230, 1235, 1240, 1280)
      >
      > df <- data.frame(no, interval, vowel, time, f1, f2)
      >
      > # select only vowel = 'xi'
      > df <- df[df$vowel == 'xi', ]
      > print(df)
      no interval vowel time f1 f2
      1 1 i1 xi 0.00 191 1110
      2 2 i1 xi 0.01 191 1115
      3 3 i1 xi 0.02 191 1140
      4 4 i1 xi 0.03 191 1145
      5 5 i1 xi 0.04 191 1150
      6 6 i1 xi 0.05 191 1155
      7 7 i2 xi 0.00 200 1200
      8 8 i2 xi 0.01 200 1220
      9 9 i2 xi 0.02 200 1230
      10 10 i2 xi 0.03 200 1235
      11 11 i2 xi 0.04 200 1240
      12 12 i2 xi 0.05 200 1280
      >
      > # get interval category values
      > interval_cat <- unique(df$interval)
      > print(interval_cat)
      [1] i1 i2
      Levels: i1 i2
      >
      > # blank DataFrame to store results
      > df_selected <- data.frame()
      >
      > # select 'f[n-1]' observations which meet the condition, f[n] - f[n-2] < 20
      > # and then => append it to df_selected DataFrame
      > for (i in 1:length(interval_cat)) {
      +
      + # subset by interval_category
      + df_tmp <- subset(df, interval == interval_cat[i])
      +
      + # for loop per interval subset
      + for (j in 3:length(df_tmp)){
      +
      + gap = df_tmp[j, 'f2'] - df_tmp[j-2, 'f2']
      +
      + if (gap < 20) {
      + df_tmp_selected <- df_tmp[j-1, c('interval', 'no', 'time', 'f2')]
      + df_selected <- rbind(df_selected, df_tmp_selected)
      + }
      + }
      + }
      >
      > print(df_selected)
      interval no time f2
      4 i1 4 0.03 1145
      5 i1 5 0.04 1150
      9 i2 9 0.02 1230
      10 i2 10 0.03 1235

    • Monsieur CHA 2019.03.23 18:58 신고  수정/삭제

      감사합니다 많은 도움이 되었습니다 ^^ 죄송하지만 하나만 물어봐도 될까요?
      만약에 20이 넘을 경우 반복 재생을 하여 20이 안넘는 구간만 계속 찾기를 반복하려면 어떻게 코딩을 해야할까요?

    • R Friend R_Friend 2019.03.23 19:01 신고  수정/삭제

      네, 지금 짠 코드가 말씀하신 내용을 구현해놓은 것입니다. 계속 for loop 돌면서 끝 행까지 다 gap 검사를 하는 방식입니다.

    • Monsieur CHA 2019.03.23 19:23 신고  수정/삭제

      주말이신데 계속 귀찮게 해드려 죄송합니다. 만약 interval에서 i2 값을 모두 i1으로 바꾸어 i1만 존재하게 할 경우, 20 미만의 차가 4, 5만 나오고
      i2가 있을시 9, 10번에 해당하는 값이 나오지가 않네요. 이럴 경우는 어떻게 해결을 해야할까요?
      (i1에서 20미만의 차가 나오는 모든 경우의 수를 구하려 합니다.)

    • R Friend R_Friend 2019.03.23 19:43 신고  수정/삭제

      아, 제가 두번째 for loop 문에서 실수를 했네요. 혼선을 드려 죄송합니다. ^^;

      [기존] for (j in 3:length(df_tmp)) 를
      [수정] for (j in 3:nrow(df_tmp)) 로 변경해주시면 됩니다.

      ##=======================

      > # input data
      > no <- c(1:12)
      > interval <- c(rep('i1', 12))
      > vowel <- c(rep('xi', 12))
      > time <- c(rep(c(0, 0.01, 0.02, 0.03, 0.04, 0.05), 2))
      > f1 <- c(rep(191, 6), rep(200, 6))
      > f2 <- c(1110, 1115, 1140, 1145, 1150, 1155, 1200, 1220, 1230, 1235, 1240, 1280)
      >
      > df <- data.frame(no, interval, vowel, time, f1, f2)
      >
      > # select only vowel = 'xi'
      > df <- df[df$vowel == 'xi', ]
      > print(df)
      no interval vowel time f1 f2
      1 1 i1 xi 0.00 191 1110
      2 2 i1 xi 0.01 191 1115
      3 3 i1 xi 0.02 191 1140
      4 4 i1 xi 0.03 191 1145
      5 5 i1 xi 0.04 191 1150
      6 6 i1 xi 0.05 191 1155
      7 7 i1 xi 0.00 200 1200
      8 8 i1 xi 0.01 200 1220
      9 9 i1 xi 0.02 200 1230
      10 10 i1 xi 0.03 200 1235
      11 11 i1 xi 0.04 200 1240
      12 12 i1 xi 0.05 200 1280
      >
      > # get interval category values
      > interval_cat <- unique(df$interval)
      > print(interval_cat)
      [1] i1
      Levels: i1
      >
      > # blank DataFrame to store results
      > df_selected <- data.frame()
      >
      > # select 'f[n-1]' observations which meet the condition, f[n] - f[n-2] < 20
      > # and then => append it to df_selected DataFrame
      > for (i in 1:length(interval_cat)) {
      +
      + # subset by interval_category
      + df_tmp <- subset(df, interval == interval_cat[i])
      +
      + # for loop per interval subset
      + for (j in 3:nrow(df_tmp)){
      +
      + gap = df_tmp[j, 'f2'] - df_tmp[j-2, 'f2']
      +
      + if (gap < 20) {
      + df_tmp_selected <- df_tmp[j-1, c('interval', 'no', 'time', 'f2')]
      + df_selected <- rbind(df_selected, df_tmp_selected)
      + }
      + }
      + }
      >
      > print(df_selected)
      interval no time f2
      4 i1 4 0.03 1145
      5 i1 5 0.04 1150
      9 i1 9 0.02 1230
      10 i1 10 0.03 1235

    • Monsieur CHA 2019.03.23 19:52 신고  수정/삭제

      덕분에 해결 되었습니다. 정말로 감사합니다 ^^ 즐거운 주말 되시고 오늘도 좋은 하루되세요 ^^