방명록

  1. 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

  2. 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  수정/삭제

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

  3. 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 신고  수정/삭제

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

  4. killian 2019.03.20 19:27  수정/삭제  댓글쓰기

    안녕하세요
    이 사이트에서 덕분에 많은 것을 배우고있는 R 초보자입니다.
    다름이 아니라 진행중 막히는 부분이있어 답답함에 글을 씁니다....

    간단한 질문일수도 있다고 생각합니다.


    Q. 컬럼 내 특정숫자를 일정부분 까지만 인식하여 데이터 변환 또는 이용

    ex) raw data의 열에서
    IGHV1-18*01
    IGHV3-23*01
    IGHV3-23*02
    IGHV4-1*01
    IGHV5-2*01
    이러한 식으로 존재하면 제가 원하는 부분은 뒤의 * 이후가 없는
    IGHV1-18
    IGHV3-23
    IGHV3-23
    IGHV4-1
    IGHV5-2
    위와 같이 변형하고 싶습니다.

    실제 "bcRep" package에서
    > Vgu <-geneUsage(genes = x, level = "subgroup or gene", functionality = "")
    위의 명령에서 level =" subgroup or gene" 으로 구분이 가능합니다
    ex) data가 IGHV1-18*01 이라면
    level = "subgroup" 에 의해 IGHV1 까지만 구분
    level = "gene" 에 의해 IGHV1-18 까지만 구분하여 데이터가 처리됩니다

    위와같은 명령어가 궁금한데 도움주시면 감사드리겠습니다.

    • R Friend R_Friend 2019.03.20 19:38 신고  수정/삭제

      안녕하세요 killian님, 반갑습니다.
      아래 코드 참고하시기 바랍니다.

      > ## spliting character in dataframe by delimeter
      > df <- data.frame(col = c('IGHV1-18*01',
      + 'IGHV3-23*01',
      + 'IGHV3-23*02',
      + 'IGHV4-1*01',
      + 'IGHV5-2*01'))
      >
      > df
      col
      1 IGHV1-18*01
      2 IGHV3-23*01
      3 IGHV3-23*02
      4 IGHV4-1*01
      5 IGHV5-2*01
      >
      > df_2 <- data.frame(do.call('rbind',
      + strsplit(as.character(df$col),
      + split='*',
      + fixed=TRUE)))
      >
      > df_2
      X1 X2
      1 IGHV1-18 01
      2 IGHV3-23 01
      3 IGHV3-23 02
      4 IGHV4-1 01
      5 IGHV5-2 01

  5. DH 2019.03.06 18:25  수정/삭제  댓글쓰기

    R전처리 과정 궁금한 게 있어서 찾다가 흘러들어왔습니다^^

    올려주신 것들만 열심히 공부해도 될 정도로 좋은 정보가 많네요!
    잘 보겠습니다!!!

  6. 질문있어요 2019.01.23 09:51  수정/삭제  댓글쓰기

    안녕하세요 ㅎㅎ 항상 배우러 오는 사이트입니다.
    다름이 아니라 질문이있어서 요청드립니다.
    R에서 난괴법분산분석을 하는것에 있어서 문의드립니다.
    aphid=rep(c("a","b","c","d","e","f"),each=3)
    re=rep(c(1:6),3)
    y=c(1.8,0.0,0.0,4.6,0.0,0.0,0.0,0.0,0.5,0.0,0.0,1.8,0.0,0.0,1.7,140.9,161.5,151.3)
    iw=data.frame(aphid,re,y)
    aphid=as.factor(aphid)
    re=as.factor(re)
    iw
    iw.aov=aov(y~re+aphid+re:aphid)
    summary(iw.aov)

    # lsd 검정 #
    library(agricolae)
    iw.lsd=LSD.test(iw.aov,"aphid",p.adj="none",group=T)
    iw.lsd

    이렇게하는게맞나욥?...ㅠ

    • R Friend R_Friend 2019.01.23 11:57 신고  수정/삭제

      "R 통계" 카테고리에 ANOVA 관련 여러개 글을 포스팅했는데요, "R 통계" 카테고리 후반부 글들 참고해보시면 좋겠습니다.

    • 질문있어요 2019.01.23 13:37  수정/삭제

      gender.fac <- as.factor(c(rep("a", 3), rep("b", 3), rep("c",3), rep("d",3), rep("e",3), rep("f",3)))
      class <- c("ex_1", "ex_1", "ex_1", "ex_2", "ex_2", "ex_2", "ex_3", "ex_3", "ex_3")
      class.fac <- as.factor(c(rep(class,2)))
      class.fac
      score_stats<-c(0.0,1.3,0.9,0.0,0.0,2.3,0.7,1.8,2.7,2.5,1.3,0.0,0.0,1.7,0.0,118.2,132.5,116.7)
      score.df<- data.frame(gender.fac, class.fac, score_stats)
      score.df
      summaryBy(score_stats ~ gender.fac, data=score.df, FUN = c(mean, sd, min, max))
      summaryBy(score_stats ~ class.fac, data=score.df, FUN = c(mean, sd, min, max))
      summary(score_stats, data=score.df)
      par(mfrow = c(2, 2))
      plot(score_stats ~ gender.fac, main="box plot by gender")
      plot(score_stats ~ class.fac, main="box plot by class")
      interaction.plot(gender.fac, class.fac, score_stats, bty='l', main="interaction effect plot")
      interaction.plot(class.fac, gender.fac, score_stats, bty='l', main="interaction effect plot")
      aov_model = aov(score_stats ~ gender.fac + class.fac + gender.fac:class.fac)
      summary(aov_model)

      선생님께서 작성해준것에 숫자만 바꾸었는데 저는왜 class에 대한것과 class와 gender와의 교호작용은 분산분석이 결과가안나올까요? 서로 관계가없어도 결과는 나오지않나욥?..

      이실험의 경우 토양상태에 영향을 미칠수 있어서 난괴법이라 반복(블록)별로도 분산분석결과가 있어야하거든욥 ㅠ

  7. 가히 2019.01.23 09:03  수정/삭제  댓글쓰기

    가히 최고의 r 블로그라고 생각합니다. 그뿐 아니라 통계나 선대도 정리를 너무 잘해주셨는데요. 앞으로 최적화 등의 블로그도 계속 써나가시길 응원하겠습니다..

  8. hmmoon 2018.12.27 10:06  수정/삭제  댓글쓰기

    포스팅 감사드리며 질문이 있어 글을 남깁니다.

    1. https://jmonlong.github.io/Hippocamplus/2017/09/19/mummerplots-with-ggplot2/

    2. http://mummer.sourceforge.net/examples/#mummermummer

    위의 사이트를 참조하여 delta형식의 파일을 읽어 2번째 사이트의 2.2.3 목차의 plot을 만드는 작업을 진행중입니다.

    즉, delta 형식의 파일을 읽어 플롯을 만들어 비교를 하는 작업을 진행중입니다.

    진행하면서 문제점으로는
    1. delta 형식의 파일을 읽지 못함
    2. 1번의 작업을 진행하지 못해 plot을 구현 못함

    이와 같은 문제점이 발생하였습니다. 1번 참조 사이트의 예제를 복사하여 진행하여도
    Error in lapply(lines.l, length) %>% as.numeric :
    could not find function "%>%
    이러한 에러가 나타나 예제마저 진행하지 못해 이해함에 어려움을 겪고 있습니다.
    실례가 안된다면 이러한 문제점에 대한 조언을 남겨주시면 감사하겠습니다.

    • R Friend R_Friend 2018.12.27 10:43 신고  수정/삭제

      안녕하세요 hmmoon님, 제가 밖에 나와 있어서 컴퓨터로 실향해볼 수거 없는 상황인데요, 에레 메시지 남겨놓으신게 chain operater 가 안된다고 하는거 보니 추측컨데,
      install.pacjages("dplyr")
      library(dplyr)
      이렇게 ,dplyr 패키지 설치, 로딩 해보실래요?

    • hmmoon 2018.12.28 14:07  수정/삭제

      안녕하세요.

      말씀해주신 방법을 통해 1번 참고 사이트의 예제를 진행할 수 있었습니다.

      예제의 코드를 응용하여 수정을 진행하여 업무를 진행하고 있습니다.

      감사의 말을 전하며, 추가적인 질문을 드리려고 합니다.

      1번 참고 사이트의 코드에서
      readDelta <- function(deltafile){
      lines = scan(deltafile, 'a', sep='\n', quiet=TRUE) #
      lines = lines[-1]
      lines.l = strsplit(lines, ' ')
      lines.len = lapply(lines.l, length) %>% as.numeric
      lines.l = lines.l[lines.len != 1]
      lines.len = lines.len[lines.len != 1]
      head.pos = which(lines.len == 4)
      head.id = rep(head.pos, c(head.pos[-1], length(lines.l)+1)-head.pos)
      mat = matrix(as.numeric(unlist(lines.l[lines.len==7])), 7)
      res = as.data.frame(t(mat[1:5,]))
      colnames(res) = c('rs','re','qs','qe','error')
      res$qid = unlist(lapply(lines.l[head.id[lines.len==7]], '[', 2))
      res$rid = unlist(lapply(lines.l[head.id[lines.len==7]], '[', 1)) %>% gsub('^>', '', .)
      res$strand = ifelse(res$qe-res$qs > 0, '+', '-')
      res
      }
      사용자가 설정한 기능에대해 도저히 이해를 할 수 없기에 응용을 하려해도 쉽지 않은 상황입니다.

      1. scan(deltafile, 'a', sep='\n', quiet=TRUE) : 'a'의 의미가 무엇이며
      2. lines.len = lapply(lines.l, length) %>% as.numeric : 이 코드 부터 마지막까지 의미를 몰라 어려움이 있기에 도움을 청해봅니다.

      감사합니다.

    • R Friend R_Friend 2018.12.28 22:58 신고  수정/삭제

      제가 내년 초까지 가족여행을 와서 한동안 컴퓨터를 못씁니다. 그래서 핸드폰으로 짧게 답변 남겨요.

      (1) scan()함수는 https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/scan 를 참고하세요.

      (2) 함수 안의 코드가 이해가 안될때는 함수 안의 코드를 복사해서 편집창에 붙여놓고, 실제 데이터셋 한개를 순차적으로 실행시켜보면서 결과를 확인해보는 것입니다. (사용자정의함수를 만들때 사용하는 방법을 거꾸로 한다고 생각하시면 됩니다)

      제가 일일이 설명드리기가 힘들기도 하구요, 제일 이해하기 쉬운 방법은 실제 데이터셋 실행시켜보는 것이거든요.

  9. SY 2018.12.08 04:53  수정/삭제  댓글쓰기

    처음에 R 공부를 시작할 때 정말 많은 도움을 받았는데 시간이 흘러... 파이썬을 공부하러 다시 오게되었네요 ㅎㅎ... 많은 블로그를 보았지만 여기만한 곳이 없는 것 같아요. 늦게나마 감사 인사 드립니다.

    • R Friend R_Friend 2018.12.16 18:19 신고  수정/삭제

      안녕하세요 SY님, 방명록 글 감사합니다.
      한동안 블로그 포스팅을 못했는데요, 남겨주신 글 보고 힘얻어서 다시 열심히 포스팅해보겠습니다.

    • sigmaseo 2018.12.18 17:25  수정/삭제

      4차 산업, DT 관련하여
      R을 공부하게 되었습니다.

      저는 6시그마, 미니탬을 통해 통계를 알고 있는 상태입니다.
      포스팅 내용을 차근차근 공부하고 있습니다.

      너무 감사합니다.

  10. pointclouds 2018.11.25 04:44  수정/삭제  댓글쓰기

    안녕하세요!
    꾸준하게 유용한 포스팅 올려주셔서, 공부해야 할 때마다 매번 찾게되는 것 같습니다. ^^ 감사합니다!
    제가 이번에 point cloud (.las)를 처음 다뤄보게 되었는데요, 자료를 활용할 방법을 이리저리 검색해보다가 아래의 홈페이지에서 샘플로 제시한 것을 적용해보기에 적합하다는 생각을 했습니다.

    핵심은 위에서 2차원적으로 눌러보았을 때 발생하는 면적(area)과, 이것을 delunay triangulation과 같은 함수를 적용하여 3차원의 부피(volume)를 모두 구해서 비교하는 것입니다.

    샘플 코드가 적용되어 있어 변형해서 응용하고 싶은데요, 제 data의 경우는 [X,Y,Z]가 각각[x좌표, y좌표, 높이(height)]에 해당합니다.

    선생님께서 보시기에 아래의 코드를 통해 원하는 결과를 얻기에, 저의 데이터 형태가 적합한지, 구동이 가능한 코드인지 등에 대해 여쭙고 싶습니다.

    그 홈페이지 주소는 아래와 같으며, 첫번째 답변에 해당하는 내용입니다. 이하는 그 홈페이지의 친구가 올려둔 코드 전문입니다.

    답변해주시면 정말 감사하겠습니다. 편안한 주말 되세요 ^^

    https://stackoverflow.com/questions/45106812/find-volume-of-3d-peaks-in-matlab

    -----------------------------------이하 ----------------------------------------

    [x,y,z] = peaks(30); % some data
    subplot 131
    scatter3(x(:),y(:),z(:),[],z(:),'filled')
    title('The original data')
    th = 2.5; % set a threshold for z values
    hold on
    surf([-3 -3 3 3],[-4 4 -4 4],ones(4)*th,'FaceColor','k',...
    'FaceAlpha',0.5)
    hold off
    ind = z>th; % get an index of all values of interest
    X = x(ind);
    Y = y(ind);
    Z = z(ind);
    clustNum = 3; % the number of clusters should be define manually
    T = clusterdata([X Y],clustNum);
    subplot 132
    gscatter(X,Y,T)
    title('A look from above')
    subplot 133
    hold on
    c = ['rgb'];
    for k = 1:max(T)
    valid = T==k;
    % claculate a triangulation of the data:
    DT = delaunayTriangulation([X(valid) Y(valid) Z(valid)]);
    [K,v] = convexHull(DT); % get the convex hull indices
    % plot the volume:
    ts = trisurf(K,DT.Points(:,1),DT.Points(:,2),DT.Points(:,3),...
    'FaceColor',c(k));
    text(mean(X(valid)),mean(Y(valid)),max(Z(valid))*1.3,...
    num2str(v),'FontSize',12)
    end
    hold off
    view([-45 40])
    title('The volumes')


    • R Friend R_Friend 2018.12.16 18:28 신고  수정/삭제

      안녕하세요 pointclouds님, 답변이 한참 늦어서 죄송합니다.

      남겨주신 코드가 보니 matlab 이네요. matlab은 사용해본적은 없는데요, 대략 보니 matlab 코드 참고해서 R이나 Python으로 변환할 수 있을 것 같습니다.

      가지고 계신 [X, Y, Z] 데이터 형태와 잘 맞는 코드 예제 같습니다.