방명록

  1. soulspasm 2019.07.17 13:20  수정/삭제  댓글쓰기

    안녕하세요. 우연히 방문했다가 좋은 자료들이 너무 많아 자주 도움을 받고 있습니다.
    연산자 단축키에 관해 문의 드립니다. %in% 연산자를 단축키로 입력할 수 있는지요?

    • R Friend R_Friend 2019.07.17 16:56 신고  수정/삭제

      안녕하세요 soulspasm님,
      저도 %in% 연산자 단축키는 사용해본 적이 없어서 잘 모르겠습니다. ^^;

      dplyr 패키지의 chain pipe operator (%>%)의 단축키는 shift +ctrl + m 입니다. https://rfriend.tistory.com/236 참고하세요.

      그 외 RStudio 단축키 설명은 https://support.rstudio.com/hc/en-us/articles/200711853-Keyboard-Shortcuts 를 참고하시기 바랍니다.

  2. HOOOO 2019.06.10 19:39  수정/삭제  댓글쓰기

    전처리 관련 질문 남깁니다...
    CSV파일 불러올때, 한 cell안에 띄어쓰기가 있는 경우 어떻게 처리해야하나요?
    header는
    FACTORY / SITE / DEVICE GROUP / MCP SALE / CLASS /M201905 / M SUM / W201919 / W201920/ W201921/W201922 /W SUM

    Data는
    TEST/ NONE/ AB ABC E / A-EFGEH / Input (EA) / 102390 / 102390 / 87867 / 2403 / 0 / 0 / 90270

    이런식으로 되어있습니다. 그런데, 각 cell의 공백부분 때문에 밀려서 제대로 데이터를 불러올수가 없는데, 이런경우 어떻게 해야하나요?

    ===========================================================================
    Warning messages:
    1: In read.table("Raw_data.csv", header = TRUE, comment.char = "", :
    line 1 appears to contain embedded nulls
    2: In read.table("Raw_data.csv", header = TRUE, comment.char = "", :
    line 2 appears to contain embedded nulls
    3: In read.table("Raw_data.csv", header = TRUE, comment.char = "", :
    'Raw_data.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다

    =========================혹은
    Error in read.table("Raw_data2.txt", header = T, fileEncoding = "EUC-KR") :
    열의 개수가 열의 이름들보다 많습니다

    • R Friend R_Friend 2019.06.10 19:54 신고  수정/삭제

      안녕하세요.
      혹시 파일이 크지 않고 공백이 일정(예: 스페이스 1개)하다면 텍스트 편집기(예: 울트라에디터, 노트패드++ 등)로 공백을 find-replace 하기로 편집후 R로 읽어보시지요.

      R에서 읽는 방법은 집에 가서 저도 테스트해봐야 하는데요, 밤 11시쯤 들어갈듯 하네요.

    • HOOOO 2019.06.10 20:07  수정/삭제

      공백이 여러개라서 R에서 불러오는 법이 필요합니다 ㅠㅠ 천천히 확인 해주셔도 됩니다!!

    • R Friend R_Friend 2019.06.10 20:14 신고  수정/삭제

      공백을 어떻게 처리해야 하나요? 제거하나요, 아니면 그대로 남겨두나요? 구분자(/) 앞뒤로도 공백이 있나요? 아니면 예로 든 data 예 중 AB ABC E 처럼 값의 중간에 공백이 있는건가요?

    • R Friend R_Friend 2019.06.11 00:05 신고  수정/삭제

      아래 2개 코드 참고해서 한번 해보시지요.


      (1) header 를 FALSE로 하고, 1번째 라인 skip하고, 칼럼이름을 직접 입력하되 칼럼이름의 공백은 '_'로 대체. sep="/" 지정, comment.char="" 를 지정해서 '#' 으로 인한 에러 방지, strip.white=TRUE로 지정해서 white space 제

      df <- read.table("C:/Users/admin/Documents/data.txt",
      sep = "/",
      header = FALSE,
      skip = 1,
      col.names = c("FACTORY", "SITE", "DEVICE_GROUP", "MCP_SALE",
      "CLASS", "M201905", "M_SUM", "W201919",
      "W201920", "W201921", "W201922", "W_SUM"),
      strip.white = TRUE,
      comment.char = "")

      (2) header=TRUE로 하되 sep="/" 로 구분자 지정, comment.char = "" 로 '#'으로 인한 에러 방지, strip.white=TRUE로 white space 제거

      df2 <- read.table("C:/Users/admin/Documents/data.txt",
      header = TRUE,
      sep = "/",
      strip.white = TRUE,
      comment.char = "")

      이래도 에러 나면 na.strings 옵션 참고해서 시도해보시기 바랍니다.

    • HOOOO 2019.06.11 10:33  수정/삭제

      공백 처리는 제거해도 되고, 남겨도 됩니다.
      구분자는 cell 구분을 위해 제가 임의로 넣은것입니다!
      AB ABC E처럼 중간에 공백이 존재합니다. 위에 알려주신 대로 해봤는데, 에러가 나네요 ㅠㅠ
      =========================
      'Raw_data.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다

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

      원본 파일을 열은 후에 마지막줄에 커서 위치 후, 엔터를 한번 쳐서 줄을 내리시고, 저장 후 파일을 닫고, 다시 한번 R 실행시켜 보실래요?

      sep 구분자는 sep="," 처럼 실제 사용하신 구분자 설정하시구요.

    • HOOOO 2019.06.11 16:19  수정/삭제

      CSV 파일이라 구분자는 따로 없이 다른 칸에 들어있는 것입니다..ㅠㅠ 원본파일에 마지막줄 엔터 치고 저장하고 말씀하신대로 해봤는데 안됩니다 ㅠㅠ

      Error in make.names(col.names, unique = TRUE) :
      invalid multibyte string 4
      In addition: Warning message:
      In read.table("Raw_data.csv", header = T, strip.white = TRUE, comment.char = "") :
      'Raw_data.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다
      >

      =======================

      다른 PC에서 그냥
      read.csv("data.csv", header=T) 만했는데, 잘 불려오는데.....뭐가문제인걸까요?

    • R Friend R_Friend 2019.06.11 16:23 신고  수정/삭제

      첫번째 방법으로 해보시되, csv파일의 구분자가 콤마이므로 sep="," 로 설정하고 해보시지요.
      (마지막줄에서 엔터 치고 저장한 파일에 대해서요)

    • HOOOO 2019.06.11 17:00  수정/삭제

      동일합니다 ㅠ

    • R Friend R_Friend 2019.06.11 17:09 신고  수정/삭제

      아, 그럼 저도 도와드릴수가 없겠네요. 방명록에 남겨주신 데이터로 어제 밤에 테스트해봤는데요, 동일한 에러 재현이 안되더라구요. 그래서 가설적으로 의견드려봤던건데요, 죄송합니다. ㅜ.ㅜ

    • HOOOO 2019.06.11 17:11  수정/삭제

      아닙니다 바쁘실텐데 도와주셔서 감사합니다 ㅠㅠ

  3. 꾸리꾸리 2019.05.24 11:38  수정/삭제  댓글쓰기

    전처리 관련 질문 남깁니다.

    1.Dataframe 형식 (ex .5열 300행)
    2. 2열과 3열을 기준으로 하여 새롭게 필터링

    A B C D E
    . X Y . . (1col)
    . XX Y . . (2col)
    . Z X . . (3col)
    . XXXXX Z . . (4col)

    이러한 데이터 프레임에서 B와 C를 기준으로 하여 첫번째와 세번째 줄의 형식만 추출하려 합니다.
    즉, 문자가 하나만 나타난 B와 C를 추출하고 두번째와 네번째를 보게 되면 문자의 개수가 다른 부분은 제거하는 방법에 대해 도움을 주실 수 있는지 글을 남깁니다.
    최종적으로, A~E까지의 열이 나타내어 B와 C는 공통적으로 문자가 하나인 행만 필터 하려 합니다.
    subset을 이용하여 하려하는데 맞는 방향인지도 부탁드립니다..
    ( 필요에 의해 문자의 개수가 다른 부분도 뽑아낼 수 있기에 이와 관련하여서도 방법이 있는지 부탁 드립니다)

    • R Friend R_Friend 2019.05.24 11:46 신고  수정/삭제

      (1) 이전에 방명록에 남기셨던 몇 개의 질문들은 모두 해결이 되셨는지요? 잘 해결이 되었다면 그에 대한 답글을 달아주세요.

      (2) 이번 질문을 이해하기가 힘든데요, output 예시를 추가해주세요.

      (3) 제가 회사 일로 너무 바빠서 내일 오후나 저녁에 답변 가능합니다.

    • 꾸리꾸리 2019.05.24 11:58  수정/삭제

      1. 네 이전에 문제점은 해결이 되었습니다.
      바쁘신데 시간을 내어 도움을 주셔서 감사 드립니다.

      2. rawdata file
      A B C D
      C X Y -
      파이썬 Y ZZZZ -
      R XX Y -
      Java Z ZYYY -
      SQL Z X

      output file
      A B C D
      C X Y -
      SQL Z X -

      (B와C 처럼 문자의 형식에 상관없이 문자의 개수가 1개인 모든 행을 추려내어 나타내려 합니다.
      파이썬, R, 자바 같은 경우는 B와 C의 값을 비교하였을때 문자의 개수가 다르기 때문에 output파일에서 제거하여 나타내었습니다.
      추후에 반대로 문자의 개수가 다른것만으로도 추출을 하려 합니다)
      3. 도움을 주시는 것으로도 감사드립니다. 여유가 되시면 봐주시기 바랍니다.

    • R Friend R_Friend 2019.05.24 15:23 신고  수정/삭제

      이전 문제는 잘 해결되었다니 다행이네요.

      B, C 열의 문자열 길이가 같은 행만 선별하는 것은 아래 코드 참고하시기 바랍니다.

      library(dplyr)

      df_equal <- df %>% filter(nchar(as.character(B)) == nchar(as.character(C)))

      df_not_equal <- df %>% filter(nchar(as.character(B)) != nchar(as.character(C)))

    • 꾸리꾸리 2019.05.26 00:33  수정/삭제

      답변 감사드립니다.
      문제점은 잘 해결되었습니다.
      감사합니다.

  4. 꾸리꾸리 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) 생성하면 되겠네요.

  5. 꾸리꾸리 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)로 구분하나요?

  6. 꾸리꾸리 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

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

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

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

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

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

  9. 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) 입니다.

  10. 이상규 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))),]