방명록

  1. 초코초코 2019.11.17 08:37  수정/삭제  댓글쓰기

    안녕하세요 선생님. 선생님의 친절하고 자세한 설명 덕분에 Rstudio를 유용하게 사용하고 있는 한 사람입니다. 항상 감사드립니다.
    다름이 아니라, 질문을 하나 하고싶은데 gcookbook 패키지에 있는 cabbage_exp 데이터를 활용하여 다음과 같은 형태의 정보(테이블)을 출력가능한 코드를 작성하고 싶은데, 어떻게 해야할지 여쭤보고 싶습니다.
    Cultivar d16 d20 d21
    1 c39 3.18 2.8 2.74
    2 c52 2.26 3.11 1.47

    na를 제거하고 같은 cultivar 기준으로 열을 합치는 방법을 잘 모르겠습니다... 혹시 방법을 알려주신다면 정말 감사하겠습니다. 감사합니다.

    • R Friend R_Friend 2019.11.17 11:54 신고  수정/삭제

      안녕하세요 초코초코님,
      블로그 좋게 봐주셔서 감사합니다.

      아래의 코드를 참고해서 한번 실행해보시기 바랍니다. 혹시 결측값을 제거(drop)하는 대신에 다른 값으로 대체하고 싶으신 경우는 fill 옵션을 사용하시면 됩니다.

      install.packages("reshape2")
      library(reshape2)
      cabbage_exp_cast <- acast(data = cabbage_exp
      , Cultivar ~ Date
      , value.var = 'Weight'
      , fun.aggregate = mean
      #, fill = 0 # if you want to fill the missing value with '0'
      , drop = TRUE)

    • 초코초코 2019.11.17 16:52  수정/삭제

      친절한 답변 정말 감사드립니다 선생님!
      Rstudio는 정말 어렵네요...대단하십니다.
      그런데 혹시
      spread(cabbage_exp, Date, Weight) %>%
      select(Cultivar, d16, d20, d21)
      이런 코드를 사용했더니
      Cultivar d16 d20 d21
      1 c39 NA 2.80 NA
      2 c39 3.18 NA NA
      3 c39 NA NA 2.74
      4 c52 NA NA 1.47
      5 c52 2.26 NA NA
      6 c52 NA 3.11 NA

      이런식으로 나오는데 위에 말씀드린 테이블을 만들기 위해 어떤 dplyr 패키지를 추가적으로 사용해야 되는 지 여쭤봐도 될까요? 대단히 감사합니다.

    • R Friend R_Friend 2019.11.17 18:05 신고  수정/삭제

      안녕하세요 초코초코님,

      아래 코드 참고하세요.

      https://rfriend.tistory.com/80

      # load data
      library(gcookbook)
      data(cabbage_exp)
      cabbage_exp

      # reshape data using tidyverse
      library(tidyverse)

      # melt first (long format)
      cabbage_exp_melt <- cabbage_exp %>%
      group_by(Cultivar, Date) %>%
      summarise(Weight = mean(Weight))

      # cast second (wide format)
      cabbage_exp_cast <- spread(cabbage_exp_melt, key = c("Date"), value = "Weight", fill = 0)

      print(cabbage_exp_cast)
      Cultivar d16 d20 d21
      <fct> <dbl> <dbl> <dbl>
      1 c39 3.18 2.8 2.74
      2 c52 2.26 3.11 1.47

    • 초코초코 2019.11.18 12:32  수정/삭제

      친절하고 자세한 답변 정말 감사드립니다! 오늘도 좋은 하루 되시길 바라겠습니다.

  2. 꾸리꾸리 2019.11.15 09:49  수정/삭제  댓글쓰기

    안녕하세요. 시각화와 관련하여 질문을 드리려 합니다.
    길게 설명하는 것보다 참고 사이트 주소를 올립니다.
    https://www.researchgate.net/figure/The-annotation-results-of-R-sativus-transcriptome-GO-Gene-Ontology-annotation-results_fig3_258831037

    제 데이터 구성또한 참고 사이트에 나온것처럼 CC(cellular), MF(molecular function), BP(biological process) <- x축
    에 대해서 4~5천여 행이 나열되어 있습니다.

    혹시 관련할만한 게시물이나 방법이 있으시면 말씀해주시면 감사하겠습니다.

    • R Friend R_Friend 2019.11.15 09:57 신고  수정/삭제

      안녕하세요.

      제가 업무시간 중에는 시간을 낼 수가 없어서요, 퇴근 후에 한번 살펴보고 의견드릴께요

    • 꾸리꾸리 2019.11.15 10:03  수정/삭제

      네 감사합니다. 시간 내주셔서 감사합니다.

    • R Friend R_Friend 2019.11.17 12:20 신고  수정/삭제

      안녕하세요 꾸리꾸리님,

      문의하신 내용과 정확히 일치하지는 않습니다만, "클리브랜드 점 그래프(Cleveland dot plot)" 을 이용하면 예시로 남겨주신 사이트의 결과물과 유사한 그래프를 얻을 수 있을 것 같습니다.

      ggplot2의 geom_point() 함수를 사용하면 Cleveland dot plot을 그릴 수 있으면, 샘플데이터와 코드는 아래 링크 참고하시기 바랍니다.

      https://rfriend.tistory.com/75

    • 꾸리꾸리 2019.11.17 14:52  수정/삭제

      답변 감사드립니다. 추가로 질문좀 남기겠습니다. 데이터 cars93을 예시로 들면
      Cars93_P <- subset(Cars93, select = c(Model, Type, Min.Price, Max.Price)
      1. 데이터내에서 원하는 열을 추출한 결과, 4개의 각 4개의 열이 동일하게 100개의 행으로 이루어져 있는 데이터
      2. 추출한 열을 기준으로 각각의 행에서 서로 중복이 되는 문자가 있다고 한다면, ( ex, "=")
      Cars93_P <-Cars93_P[rowSums(Cars93_P == "=")<= 2,] 으로 1차 필터 후,
      3. 다시 데이터의 각 4개의 열을 기준으로, 행을 ";" 세미콜론을 기준으로 분리하여 100행을 100+a로 구성.
      ex) Model열에 1행은 사과 / Model열의 2행은 배;오렌지 / Model열의 3행은 배;귤 -> 1행 사과 / 2행 배 / 3행 오렌지 / 4행 배 / 5행 귤 (이런식으로)
      4. 각 열마다 ';'이 처음부터 몰랐기 때문에 3번 까지 진행하게 되면 4개의 열의 행의 숫자가 다릅니다.
      만약, 서로 다른 행의 개수를 하나의 데이터프레임 형식으로 만들 수 있는 방법이 있을까요?

    • R Friend R_Friend 2019.11.17 16:12 신고  수정/삭제

      안녕하세요 꾸리꾸리님,

      "서로 다른 행의 개수를 하나의 데이터프레임 형식으로 만들 수 있는 방법"을 문의하셨는데요, 데이터프레임의 각 열(column)의 길이, 포맷이 같다면 rbind() 를 이용해서 합치면 될텐데요...

      질문을 읽다보니 행(row)과 열(column)이 좀 헷갈리네요. (행이 다른게 아니라 열이 다른 것때문에 질문하신게 아닌가 싶기도 해서요)

      문자열의 구분자를 기준으로 분할(split)해서 do.call 함수로 rbind() 를 호출해서 dataframe으로 결과는 만드는 샘플 코드가 아래 링크에 있는데 참조하시기 바랍니다. 방명록에 질문 남겨주신 것과 정확하게 일치하지 않는 요건일 수 있는데요, do.call 사용법 참고하시면 도움이 될 수 도 있을것 같아서 링크남깁니다.
      https://rfriend.tistory.com/37

  3. 김종석 2019.11.04 22:38  수정/삭제  댓글쓰기

    답변 주셔서 너무 감사드립니다!

    좋은 블로그를 알게된 것 같아서 너무 기분이 좋네요.

    말씀해주신대로 공부해보도록 하겠습니다!

  4. 김종석 2019.11.04 22:22  수정/삭제  댓글쓰기

    안녕하세요?

    저는 컴퓨터 관련해서 공부를 해보지도 않았고 평범한 직장을 다니고 있습니다.

    제가 앞으로 일을 하는데 있어 데이터 분석이 필요할 것 같아 서칭을 해보던 중 R을 이용한 데이터 분석이 좋을 것 같다 라는 판단 하에 시중에 있는 책을 참고하면서 Rstudio 프로그램을 사용해 차근차근 공부해 나가고 있습니다.

    혹시 저와 같이 처음 r을 시작하는 사람들이 참고할만한 책, 강의 등을 추천해주신다면 어떤 것들이 있는지 궁금합니다.

    현재 저는 이지스퍼블리싱에서 출간된 DOIT 쉽게 배우는 R 데이터 분석이라는 책을 통해서 공부하고 있습니다.

    답변 주시면 감사드리겠습니다!

    • R Friend R_Friend 2019.11.04 22:33 신고  수정/삭제

      안녕하세요 김종석님,

      R 분석을 시작하셨다니 반갑습니다.
      처음 시작하시는거고 이미 책을 한권 구입하셨다면 두세번 정도 실습을 하시면서 반복하시면 좋겠습니다. 그리고 실제 업무에 적용하려고 노력하시다 보면 무엇을 더 공부해야할지 자연스럽게 필요한 것들이 보일거 같습니다. 앤드류능 교수의 코세라 강의 추천합니다.

  5. lighth 2019.10.28 10:14  수정/삭제  댓글쓰기

    답변 감사드립니다. 하나 또 궁금한게 생겼는데
    df
    이름 과일
    1 영수 사과, 사과, 바나나, 바나나
    2 미애 포도, 포도, 사과

    이런 식으로 과일명이 중첩되어 df$과일에
    들어있을 시 중복값을 한번만 나오게 할 수 있을까요?
    gsub 통해서 제거해보려고도 하고
    다른 방법도 시도했는데 원하는 결과로 나오지 않아서
    질문 드립니다.

    • R Friend R_Friend 2019.10.28 10:37 신고  수정/삭제

      안녕하세요, lighth님.

      unique로 중복제거 해주시면 됩니다. 아래 for loop 반복문의 4번째 줄 코드에 unique() 추가해보세요.

      for (i in 1:length(name_set)){
      df_i <- df[df$name == name_set[i], ]
      df_name_item_reshaped[i, 'name'] = name_set[i]
      df_name_item_reshaped[i, 'item'] = paste(unique(as.character(df_i$item)8, collapse=" ") # <--- add unique() here
      }

  6. Lighth 2019.10.26 16:14  수정/삭제  댓글쓰기

    https://rfriend.tistory.com/m/238
    에 있는 변환 보고 질문 드리는데 혹시
    반대일 경우도 가능 할까요??

    • R Friend R_Friend 2019.10.26 16:42 신고  수정/삭제

      안녕하세요 Lighth 님,

      아래 코드 참고하시기 바랍니다.

      > name <- c(rep('john', 3), rep('jane', 4), rep('tom', 5))
      > item <- c('apple', 'banana', 'mango', 'banana', 'kiwi', 'tomato', 'manggo', 'apple', 'tomato', 'cherry', 'milk', 'icecream')
      >
      > df <- data.frame(name, item)
      > df
      name item
      1 john apple
      2 john banana
      3 john mango
      4 jane banana
      5 jane kiwi
      6 jane tomato
      7 jane manggo
      8 tom apple
      9 tom tomato
      10 tom cherry
      11 tom milk
      12 tom icecream
      >
      > df_name_item_reshaped <- data.frame()
      > name_set <- as.character(unique(df$name))
      >
      > for (i in 1:length(name_set)){
      + df_i <- df[df$name == name_set[i], ]
      + df_name_item_reshaped[i, 'name'] = name_set[i]
      + df_name_item_reshaped[i, 'item'] = paste(as.character(df_i$item), collapse=" ")
      + }
      >
      > df_name_item_reshaped
      name item
      1 john apple banana mango
      2 jane banana kiwi tomato manggo
      3 tom apple tomato cherry milk icecream

  7. 최성원 2019.10.14 15:14  수정/삭제  댓글쓰기

    안녕하세요! 질문이 있습니다.
    "순차적패턴탐사" 방법으로 제가 해결하려는 문제를 해결 할 수 있을지...
    시간에따른 순차 데이터(정수)가 있다고 할 때,
    어떤 패턴변화가 주로 자주 나오는지 알고 싶은 건데요
    예를들어 시간에 따른 n개의 데이터 var_1 <- c(x_1, X_2, X_3, ... X_n) 에서
    갯수가 3 이상인 패턴을 정의할 수 있다고 하면
    예를들어 패턴_1 <- c(x_1, x_2, x_3), 패턴_2 <- c(x_2, x_3, x_4), ...
    패턴_n <- c(X_n-2, X_n-1, X_n) 의 n개의 패턴이 있다고 할때 어떤 패턴이 가장 많이 나오는지...
    순위를 매긴다거나 군집분집분석을 할려고 합니다.
    이런게 포스팅해주신 순차분석이나 연관분석으로 가능할 지 알고 싶고요,
    컨셉이 약간다르다면 어떤 분석방법을 사용해야 할지... 인터넷으로 서칭 해봤을때는 은닉마코브 모델이 컨셉이 비슷한 것 같기도 하고...
    조언을 구할 만한 곳이 없어서 질문드립니다 ㅠㅠ

    • R Friend R_Friend 2019.10.15 23:27 신고  수정/삭제

      안녕하세요 최성원님,

      아래 주소에 블로그 포스팅한거 참조하시기 바랍니다. for loop 반복문과 if else 조건문으로 list 에 패턴 나올 때 마다 +1 해주고, 최종 리스트를 발생빈도 기준으로 내림차순 정렬하였습니다.

      https://rfriend.tistory.com/488

  8. 최성원 2019.10.04 09:06  수정/삭제  댓글쓰기

    안녕하세요! 또 질문이 있어서요 ㅠㅠ 제가 프로그램을 제대로 배운게 아니고 구글링이나 책 찾아보면서 하다보니 ㅠㅠ 휴일 하루종일 문제해결하려고 했지만 잘 안되더라구요
    여튼 질문은.... 반복문에서 반복수만큼 데이터 프레임 생성하는 문제인데요,
    ==========
    for(i in 1:49){
    dt_i_1 <- delta_2018 %>%
    filter(A == i) %>%
    filter(B == 1) %>%
    mutate(loglik_Max = max(loglik)) %>%
    mutate(AD_Max = min(AD)) %>%
    mutate(KS_Max = min(KS)) %>%
    mutate(loglik_sc = ifelse(loglik == loglik_Max, 1, 0)) %>%
    mutate(AD_sc = ifelse(AD == AD_Max, 1, 0)) %>%
    mutate(KS_sc = ifelse(KS == KS_Max, 1, 0)) %>%
    mutate(total = (loglik_sc + AD_sc + KS_sc)) %>%
    filter(total == max(total)) %>%
    select(A, B, part, dist, mean_meanlog, shape, scale_rate_sd_sdlog, q_95, q_99, Max)

    dt_i_2 <- delta_2018 %>%
    filter(A == i) %>%
    filter(B == 2) %>%
    mutate(loglik_Max = max(loglik)) %>%
    mutate(AD_Max = min(AD)) %>%
    mutate(KS_Max = min(KS)) %>%
    mutate(loglik_sc = ifelse(loglik == loglik_Max, 1, 0)) %>%
    mutate(AD_sc = ifelse(AD == AD_Max, 1, 0)) %>%
    mutate(KS_sc = ifelse(KS == KS_Max, 1, 0)) %>%
    mutate(total = (loglik_sc + AD_sc + KS_sc)) %>%
    filter(total == max(total)) %>%
    select(A, B, part, dist, mean_meanlog, shape, scale_rate_sd_sdlog, q_95, q_99, Max)
    }

    위의 반복문 코드에서 이름이 dt_1_1, dt_1_2, dt_2_1, dt_2_2 ... dt_49_2 인 데이터 프레임을 생성하고 싶은데... 알려주신다면 너무 감사드리겠습니다.

    • R Friend R_Friend 2019.10.04 09:11 신고  수정/삭제

      안녕하세요 최성원님,

      http://rfriend.tistory.com/219 포스팅 후반부의 assign 함수 사용한 코드 참고하시기 바랍니다.

    • 최성원 2019.10.04 11:14  수정/삭제

      너무 감사드립니다!
      assign 이라는 함수 ㅠㅠ 해결했습니다!
      108 번 글도 참고했구요 ㅠㅠ
      어제 9시간동안 반복작업하다 이건 아닌것 같아서.... 6시간 동안 해결 못 했던게 힌트만 주셨는데도 30분 만에 해결이 되네요 모르는게 너무 많습니다 ㅠㅠ
      너무 감사드립니다

    • R Friend R_Friend 2019.10.04 11:15 신고  수정/삭제

      해결되었다니 기쁘네요. ^^

      저도 예전에 assign 함수를 몰라서 하루종일 헤맸던 기억이 납니다.

  9. 박장일 2019.10.03 18:29  수정/삭제  댓글쓰기

    주인장님 안녕하세요~ R 정말 유용하게 보고 있습니다.

    아마 주인장님께서 R 대한민국에서 가장 잘하신분이라고 생각합니다.

    다름이 아니라 케라스 패키지(R에서도 가능) 설명하면서

    이미지를 행렬이나 배열로 불러오는 과정 있잖아요?



    1. 제가 궁금한건 처음 이미지자체를 3D 로 된 이미지 파일을 R에서 배열로 바꿀 수 있는 패키지가 있나요?

    JPG, BMP, PNG 등은 원래 2D 로 된 이미지 파일이라서요



    2. 그러면 R에서 읽을 수 있는 3D 이미지 파일로된 확장자명은 어떤게 있나요?


    좋은하루 되세요

    • R Friend R_Friend 2019.10.03 19:31 신고  수정/삭제

      안녕하세요 박장일님,

      블로그 좋게 봐주셔서 감사합니다. :-)

      저는 이미지 처리는 python의 OpenCV 나 keras.preprocessing의 image 메소드 사용합니다. python으로 이미지 파일을 불러와서 4D tensor 로 변환하는 방법은 아래 링크를 참고하세요.

      https://rfriend.tistory.com/431

      R 로 keras 를 사용할 수 있으므로 위의 링크에 소개된 keras.preprocessing 메소드를 찾아보시면 될거 같습니다.

      from keras.preprocessing import image

      img = image.load_img(img_path, target_size=(250, 250))

      img_tensor = image.img_to_array(img)

  10. 박수민 2019.10.01 20:37  수정/삭제  댓글쓰기

    다름이아니라 이상한점이있어서 문의드립니다.
    > outa2 <- aov(obs~treat+block.fac, data=ex.2)
    > summary(outa2)
    Df Sum Sq Mean Sq F value Pr(>F)
    treat 2 3336 1668.1 536.179 1.38e-05 ***
    block.fac 2 10 4.8 1.536 0.32
    Residuals 4 12 3.1
    ---
    Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    > ex.2
    treat block.fac obs
    1 a 1 3
    2 a 2 4
    3 a 3 3
    4 b 1 4
    5 b 2 5
    6 b 3 4
    7 c 1 41
    8 c 2 46
    9 c 3 47
    > library(agricolae)
    Warning message:
    패키지 ‘agricolae’는 R 버전 3.5.3에서 작성되었습니다
    > duncan2=duncan.test(outa2,"treat",group=T)
    > duncan2
    $statistics
    MSerror Df Mean CV
    3.111111 4 17.44444 10.11115

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

    $duncan
    Table CriticalRange
    2 3.926503 3.998555
    3 4.012542 4.086173

    $means
    obs std r Min Max Q25 Q50 Q75
    a 3.333333 0.5773503 3 3 4 3.0 3 3.5
    b 4.333333 0.5773503 3 4 5 4.0 4 4.5
    c 44.666667 3.2145503 3 41 47 43.5 46 46.5

    $comparison
    NULL

    $groups
    obs groups
    c 44.666667 a
    b 4.333333 b
    a 3.333333 b

    attr(,"class")
    [1] "group"
    이거와
    > treat <- c(rep("a", 3), rep("b", 3), rep("c", 3))
    > block <- c(rep(1:3, 3))
    > block.fac <- as.factor(block)
    > obs <- c(3.0,4.0,3.0,4.0,5.0,4.0,41.0,46.0,47.0)
    > ex.2 <- data.frame(treat, block.fac, obs)
    > str(ex.2)
    'data.frame': 9 obs. of 3 variables:
    $ treat : Factor w/ 3 levels "a","b","c": 1 1 1 2 2 2 3 3 3
    $ block.fac: Factor w/ 3 levels "1","2","3": 1 2 3 1 2 3 1 2 3
    $ obs : num 3 4 3 4 5 4 41 46 47
    > ex.2
    treat block.fac obs
    1 a 1 3
    2 a 2 4
    3 a 3 3
    4 b 1 4
    5 b 2 5
    6 b 3 4
    7 c 1 41
    8 c 2 46
    9 c 3 47
    > outa2 <- aov(obs~treat+block, data=ex.2)
    > summary(outa2)
    Df Sum Sq Mean Sq F value Pr(>F)
    treat 2 3336 1668.1 521.285 1.57e-06 ***
    block 1 6 6.0 1.875 0.229
    Residuals 5 16 3.2
    ---
    Signif. codes:
    0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    > duncan2=duncan.test(outa2,"treat",group=T)
    > duncan2
    $statistics
    MSerror Df Mean CV
    3.2 5 17.44444 10.25458

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

    $duncan
    Table CriticalRange
    2 3.635351 3.754575
    3 3.748500 3.871434

    $means
    obs std r Min Max Q25 Q50 Q75
    a 3.333333 0.5773503 3 3 4 3.0 3 3.5
    b 4.333333 0.5773503 3 4 5 4.0 4 4.5
    c 44.666667 3.2145503 3 41 47 43.5 46 46.5

    $comparison
    NULL

    $groups
    obs groups
    c 44.666667 a
    b 4.333333 b
    a 3.333333 b

    attr(,"class")
    [1] "group"
    이거의 차이를 알고싶습니다. 같은값을 입력했는데, 왜다를까요? 분산분석시, 블록에서의 자유도 차이가 왜나는지 알고싶습니다.

    • R Friend R_Friend 2019.10.01 22:38 신고  수정/삭제

      안녕하세요 박수민님,

      분석 결과가 다른 이유는

      (1) block 변수를 factor (요인형) 으로 변경한 block.fac 으로 한 경우와, (<- ANOVA에서는 이게 맞음)
      => ANOVA Table 의 df 구하는 방식에 따라 계산된 결과입니다.


      (2) block 변수를 int. (정수형)으로 그대로 사용한 경우의 차이입니다. (이건 틀림. 이렇게 하지 않도록 매우 조심해야 함)