[R] 상위 N(top n) 구하기

R 2016.04.18 18:39


리스트 또는 특정 data frame의 컬럼 값의 상위 N 개를 구하고 싶을 때, tail/head, sort를 이용해서 구할 수 있다.



최고 값 대비 500 개를 얻고 싶다면, 다음 예시를 사용한다.


tail(sort(myframe$V2), n=500)


최저 값 대비 500 개를 얻고 싶다면, 다음 예시를 사용한다.


head(sort(myframe$V2), n=500)


'R' 카테고리의 다른 글

[R] 상위 N(top n) 구하기  (0) 2016.04.18
RStudio 실행 안되는 문제 해결하기  (0) 2016.03.03
[R] debug하기  (0) 2016.03.03
[R] invisible()  (0) 2016.03.02
[R] ... 사용하기  (0) 2016.03.02
[R] R에서 시간, 날짜 다루기 (as.Date, Sys.time)  (1) 2016.02.27
Posted by 김용환 '김용환'

댓글을 달아 주세요


Mac에서 RStudio 설치 후, 실행하면, 에러 팝업만 뜨는 경우를 해결하는 방법이다.


/Applications/RStudio.app/Content/MacOS 디렉토리에 RStudio가 설치되어 있는데, 로그가 따로 발생하지 않는다.


여기서 /Applications/RStudio.app/Content/MacOS/diagnostics 를 실행하면 에러의 원인을 확인할 수 있다. 




예를 들어.. 에러의 원인에 대해서 다음과 같이 확인할 수 있다.


/Applications/RStudio.app/Contents/MacOS$ ./diagnostics


[rstudio-diagnostics] ERROR system error 17 (File exists) [path=/Users/Samuel/.rstudio-desktop, target-dir=];



즉.. 에러가 안나고 RStudio를 실행하려면, .rstudio-desktop 파일을 삭제한다.





'R' 카테고리의 다른 글

[R] 상위 N(top n) 구하기  (0) 2016.04.18
RStudio 실행 안되는 문제 해결하기  (0) 2016.03.03
[R] debug하기  (0) 2016.03.03
[R] invisible()  (0) 2016.03.02
[R] ... 사용하기  (0) 2016.03.02
[R] R에서 시간, 날짜 다루기 (as.Date, Sys.time)  (1) 2016.02.27
Posted by 김용환 '김용환'

댓글을 달아 주세요

[R] debug하기

R 2016.03.03 17:31



R언에서 다양한 함수를 실행하다가 내부에서 어떻게 문제를 일으키는지 디버그를 하고 싶을 때 debug()를 사용한다.


예시 소스는 다음과 같다. 

test_function <- function(x, y) {

  x = x + 1

  y = y + 1

  x = x * x;

  y = y * x;

  y

  invisible(y)

}


debug(test_function)


test_function(2, 3)



또는 R 이나 RStudio에서 실행하면.. 디버그 모드로 전환한다.


R 실행


> test_function <- function(x, y) {

+ x = x + 1

+ y = y + 1

+ x = x * x;

+ y = y * x;

+ y

+ invisible(y)

+ }

> debug(test_function)

> test_function(2, 3)

debugging in: test_function(2, 3)

debug at #1: {

    x = x + 1

    y = y + 1

    x = x * x

    y = y * x

    y

    invisible(y)

}

Browse[2]> n

debug at #2: x = x + 1

Browse[2]> n

debug at #3: y = y + 1

Browse[2]> n

debug at #4: x = x * x

Browse[2]> n

debug at #5: y = y * x

Browse[2]> n

debug at #6: y

Browse[2]> n

debug at #7: invisible(y)

Browse[2]> n

exiting from: test_function(2, 3)




반면, RStudio는 IDE 화면의 Debug 창이 뜬다. 비슷하게 사용할 수 있다. 

그러나 작은 실수에도 Debug 창이 이슈가 생겨서 디버그 모드가 종료가 안될 수 있다..  (0.99 버전 사용중)



'R' 카테고리의 다른 글

[R] 상위 N(top n) 구하기  (0) 2016.04.18
RStudio 실행 안되는 문제 해결하기  (0) 2016.03.03
[R] debug하기  (0) 2016.03.03
[R] invisible()  (0) 2016.03.02
[R] ... 사용하기  (0) 2016.03.02
[R] R에서 시간, 날짜 다루기 (as.Date, Sys.time)  (1) 2016.02.27
Posted by 김용환 '김용환'

댓글을 달아 주세요

[R] invisible()

R 2016.03.02 21:58


R에서 함수를 사용하면 리턴 값을 기본으로 출력한다.


> visible_function <- function(a) { a }

> visible_function(1)

[1] 1


매번 나오는 것이 불편할 수 있고, 모듈로 함수를 사용하는데 verbose할 수 있다.



이 때, invisible()함수는 리턴 값을 출력하지 않는다.



> invisible_function <- function(a) { a ; invisible(a)}

> invisible_function(1)


'R' 카테고리의 다른 글

RStudio 실행 안되는 문제 해결하기  (0) 2016.03.03
[R] debug하기  (0) 2016.03.03
[R] invisible()  (0) 2016.03.02
[R] ... 사용하기  (0) 2016.03.02
[R] R에서 시간, 날짜 다루기 (as.Date, Sys.time)  (1) 2016.02.27
[R] 벡터 연산  (0) 2016.02.17
Posted by 김용환 '김용환'

댓글을 달아 주세요

[R] ... 사용하기

R 2016.03.02 21:48



R에서 ...은 다른 함수로 넘겨질 가변 매개변수를 가르킨다. 

R 내부 함수 원형을 보다보면, ...을 많이 만나게 되는데. 처음에는 뭔가 싶었는데. 역시 가변 변수였다.


> args(paste)

function (..., sep = " ", collapse = NULL) 



함수를 정의해서 ...으로 넘겨지는 모든 것을 list로 받아서 출력하는 함수를 만든다.


> dotdotdot_function <- function(a, b, ...) {

+   print(a)

+   print(b)

+   dots <- list(...)

+   print(dots)

+ }




테스트 코드이다. 


> dotdotdot_function(a,b,"xxxxxxxx")

<environment: R_GlobalEnv>

$center

[1] 10  5


$radius

[1] 5


attr(,"class")

[1] "circle"

[[1]]

[1] "xxxxxxxx"


> dotdotdot_function(a,b,"xxxxxxxx","yyyyyy")

<environment: R_GlobalEnv>

$center

[1] 10  5


$radius

[1] 5


attr(,"class")

[1] "circle"

[[1]]

[1] "xxxxxxxx"


[[2]]

[1] "yyyyyy"




'R' 카테고리의 다른 글

[R] debug하기  (0) 2016.03.03
[R] invisible()  (0) 2016.03.02
[R] ... 사용하기  (0) 2016.03.02
[R] R에서 시간, 날짜 다루기 (as.Date, Sys.time)  (1) 2016.02.27
[R] 벡터 연산  (0) 2016.02.17
[R] str(), dput(), args() : 함수 원형 보기  (0) 2016.02.15
Posted by 김용환 '김용환'

댓글을 달아 주세요



as.Date(날짜)를 사용하여 날짜를 다룰 수 있다. unclass를 이용하면 1970년 1월 1일부터 지금까지 몇 일이 지났는지 알려준다. 



> date <- as.Date("2016-03-01")

> date

[1] "2016-03-01"

> unclass(date)

[1] 16861

> unclass(as.Date("2016-03-01"))

[1] 16861

> startDate <- as.Date("1970-01-01")

> startDate

[1] "1970-01-01"

> unclass(startDate)

[1] 0

> unclass(startDate + 1)

[1] 1




Date 객체간 서로 빼면 기간이 나온다. 참고로 Date 연산은 오직 음수만 사용할 수 있다.


> date1 <- as.Date("2016-02-28")

> date2 <- as.Date("2016-03-01")

> date2 - date1

Time difference of 2 days

> date1 - date2

Time difference of -2 days

> date2 + date1

Error in `+.Date`(date2, date1) : 

  이항 연산자 + 는 "Date" 객체에 정의되어 있지 않습니다

> date2 * date1

Error in Ops.Date(date2, date1) : "Date" 객체에 정의되지 않은 *입니다

> date2 / date1

Error in Ops.Date(date2, date1) : "Date" 객체에 정의되지 않은 /입니다






현재 시간 정보를 Sys.time()으로 받아 as.POSIXlt() 함수로 시간 객체를 만들 수 있다. format() 함수를 통해서 문자열로 날짜와 시간을 얻을 수 있다. 



> t <- Sys.time()

> t

[1] "2016-02-27 08:27:34 KST"

> class(t)

[1] "POSIXct" "POSIXt" 

> time_data <- as.POSIXlt(t)

> unclass(time_data)

$sec

[1] 34.59137


$min

[1] 27


$hour

[1] 8


$mday

[1] 27


$mon

[1] 1


$year

[1] 116


$wday

[1] 6


$yday

[1] 57


$isdst

[1] 0


$zone

[1] "KST"


$gmtoff

[1] 32400


attr(,"tzone")

[1] ""    "KST" "KDT"

> time_data$mday

[1] 27

> unclass(t)

[1] 1456529255

> format(t, "%Y%H%M")

[1] "20160827"






Posted by 김용환 '김용환'

댓글을 달아 주세요

  1. Favicon of https://zabda100su.tistory.com BlogIcon 러투스 2017.06.29 16:15 신고  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다. 감사합니다.

[R] 벡터 연산

R 2016.02.17 20:48


+, -와 같은 단순한 값 연산이 가능하다.


> x <- 2

> y <- 2

> z <- x + y

> z

[1] 4



벡터에 대한 조건문을 실행할 수 있다. 

> x <- 1:4

> x > 3

[1] FALSE FALSE FALSE  TRUE

> x == 10

[1] FALSE FALSE FALSE FALSE

> x == 1

[1]  TRUE FALSE FALSE FALSE



두 벡터의 합을 구할 수 있다.

> x <- 10:20

> x

 [1] 10 11 12 13 14 15 16 17 18 19 20

> y <- 30:40

> y

 [1] 30 31 32 33 34 35 36 37 38 39 40

> z <- x + y

> y <- 30:40

> x <- 10:20

> z

 [1] 40 42 44 46 48 50 52 54 56 58 60



java, c, c++같은 구조 지향적 언어라면 아래와 같이 개발할 수 있는데, R의 벡터 연산이 무척 편리하다. 

> for (i in seq_along(x)) {

+ }

> z[i] <- x[i] + y[i]

> z

 [1] 40 42 44 46 48 50 52 54 56 58 60



행렬도 벡터 연산을 할 수 있다.

> x <- matrix(1:4, 2, 2)

> x

     [,1] [,2]

[1,]    1    3

[2,]    2    4

> y <- matrix(2:5, 2, 2)

> y

     [,1] [,2]

[1,]    2    4

[2,]    3    5

> z <- x * y

> z

     [,1] [,2]

[1,]    2   12

[2,]    6   20

> z <- x / y

> z

          [,1] [,2]

[1,] 0.5000000 0.75

[2,] 0.6666667 0.80



그러나 list는 쉽게 되지 않는다.

> x <- list(1, 2)

> y <- list(3, 4)

> z <- x + y

Error in x + y : 이항연산자에 수치가 아닌 인수입니다




Posted by 김용환 '김용환'

댓글을 달아 주세요


R에서 객체의 내부 구조를 보려면 str() 또는 dput() 함수를 호출한다.

(원형을 보는 것은 Rstudio에서 command + 클릭 하는 것과 동일하다.)


재미있는 것은 str()은 function 아규먼트만 보여주고, dput()은 function 구현체까지 보여준다.

함수 뿐 아니라 값까지도 보여준다. 


또한 string인지 number인지도 보여준다. 



> str(1)

 num 1

> str(1.1)

 num 1.1

> str("1")

 chr "1"

> str(paste)

function (..., sep = " ", collapse = NULL)  

> str(paste("1"))

 chr "1"

> str(load)

function (file, envir = parent.frame(), verbose = FALSE)  

> str(aa)

 num 1

> dput(load)

function (file, envir = parent.frame(), verbose = FALSE) 

{

    if (is.character(file)) {

        con <- gzfile(file)

        on.exit(close(con))

        magic <- readChar(con, 5L, useBytes = TRUE)

        if (!length(magic)) 

            stop("empty (zero-byte) input file")

        if (!grepl("RD[AX]2\n", magic)) {

            if (grepl("RD[ABX][12]\r", magic)) 

                stop("input has been corrupted, with LF replaced by CR")

            warning(sprintf("file %s has magic number '%s'\n", 

                sQuote(basename(file)), gsub("[\n\r]*", "", magic)), 

                "  ", "Use of save versions prior to 2 is deprecated", 

                domain = NA, call. = FALSE)

            return(.Internal(load(file, envir)))

        }

    }

    else if (inherits(file, "connection")) {

        con <- if (inherits(file, "gzfile") || inherits(file, 

            "gzcon")) 

            file

        else gzcon(file)

    }

    else stop("bad 'file' argument")

    if (verbose) 

        cat("Loading objects:\n")

    .Internal(loadFromConn2(con, envir, verbose))

}


> args(load)

function (file, envir = parent.frame(), verbose = FALSE) 

NULL





Posted by 김용환 '김용환'

댓글을 달아 주세요



1. dput/dget 예시


dput(저장)과 dget(읽기)을 이용하여 변수 값을 저장할 수 있다.


> m <- c(1,2,3)

> dput(m, file="m.R")

> m <- 0

> m

[1] 0

> m <- dget("m.R")

> m

[1] 1 2 3

>



dput으로 저장한 m.R에는 아래와 같이 저장된다.


$cat m.R

c(1, 2, 3)






2. dump /source 예시


dump는 저장, source는 읽기이다. 



> x<-"jonathan"

> y<-data.frame(a=1,b=2)

> dump(c("x","y"), file = "data.R")

> rm(x, y)

> x

에러: 객체 'x'를 찾을 수 없습니다

> y

에러: 객체 'y'를 찾을 수 없습니다

> source("data.R")

> x

[1] "jonathan"

> y

  a b

1 1 2

> str(y)

'data.frame': 1 obs. of  2 variables:

 $ a: num 1

 $ b: num 2



저장된 파일을 보면, 다음과 같은 형태로 저장됨을 확인할 수 있다.

$ cat data.R

x <-

"jonathan"

y <-

structure(list(a = 1, b = 2), .Names = c("a", "b"), row.names = c(NA, 

-1L), class = "data.frame")





3. 바이너리 저장은 save/load이다.


> x<-"jonathan"

> y<-data.frame(a=1,b=2)

> save(x, y, file = "data.rda")

> rm(x, y)

> x

에러: 객체 'x'를 찾을 수 없습니다

> y

에러: 객체 'y'를 찾을 수 없습니다

> load("data.rda")

> x

[1] "jonathan"

> y

  a b

1 1 2

> str(y)

'data.frame': 1 obs. of  2 variables:

 $ a: num 1

 $ b: num 2




참고로 현재 메모리에 올라와있는 모든 객체도 메모리에 저장할 수 있다. 

즉, R에서 작업 중인 메모리를 가지고 있다가 다른 컴퓨터나, 메모리를 깨끗히 지워진 상태에서도 다시 메모리 정보를 읽어올 수 있다. save.image()를 활용한다.


> aa<-1

> bb<-c(1,2,3)

> cc<-data.frame(a=1, b=2)

> save.image(file = "dump.rdb")

> rm (aa,bb,cc)

> aa

에러: 객체 'aa'를 찾을 수 없습니다

> bb

에러: 객체 'bb'를 찾을 수 없습니다

> cc

에러: 객체 'cc'를 찾을 수 없습니다

> load("dump.rdb")

> aa

[1] 1

> cc

  a b

1 1 2

> bb

[1] 1 2 3





Posted by 김용환 '김용환'

댓글을 달아 주세요

[R] NA

R 2016.02.14 23:56


R에서 NA는 값이 없는 것(Missing value)을 의미한다. not available의 약자이다. 통계에서는 결측값이라고도 한다.

is.na()로 NA인지 확인할 수 있다.


NAN은 NA이지만, 반대의 값이 true가 아닌 것을 의미한다. 

is.nan()은 NAN인지 확인할 수 있다.


> x <-  c(1, 2, NA)

> x

[1]  1  2 NA

> is.na(x)

[1] FALSE FALSE  TRUE

> is.nan(x)

[1] FALSE FALSE FALSE




na 값을 채울 수 있다.

> x <-  c(1, 2, NA)

> x[is.na(x)] <- 10

> x

[1]  1  2 10





일부 함수는 na가 포함된 값에 대해서는 계산을 하지 못한다. na.rm=TRUE 값을 매개변수로 던지면 값을 얻을 수 있을 수도 있다.


> mean(x)

[1] NA

> mean(x, na.rm=TRUE)

[1] 1.5

> sum(x, na.rm=TRUE)
[1] 3


또한, na가 얼마나 있는지 sum() 함수로 개수를 확인할 수 있다.


> x <-  c(1, 2, NA)

> sum(is.na(x))

[1] 1

> x <-  c(1, 2, NA, NA, NA)

> sum(is.na(x))

[1] 3



na.omit() 함수로 na를 없앨 수 있다.


> x <-  c(1, 2, NA)

> y<- na.omit(x)

> y

[1] 1 2

attr(,"na.action")

[1] 3

attr(,"class")

[1] "omit"





Posted by 김용환 '김용환'

댓글을 달아 주세요