라벨이 R프로그래밍인 게시물 표시

(R) unique 함수

>unique(AA[, c("XX","YY","ZZ")]) 예) mau<-unique(dau[,c("region_month","device","user_id")]) -->AA라는 데이터에서 항목 XX와 YY,ZZ가 중복되지 않도록 정리할 수 있다. XX만 다른 값이고 YY와 ZZ가 같은 값이라면 양쪽 대이터가 남지만 XX,YY,ZZ모두 같은 값이라면 중복처리되어 하나만 남게된다. >unique(AA[AA$XX=="xxx", c("X","Y","Z")]) 예) fp.mau<-unique(dau[dau$device=="FP",c("region_month","device","user_id")]) sp.mau<-unique(dau[dau$device=="SP",c("region_month","device","user_id")]) 위 코드는 AA라는 데이터에서 AA의 항목이 xxx인 것만 추출하고 X,Y,Z의 항목이 중복되지 않도록 데이터를 가공하는 것이다.

(R) 타입 판별

데이터를 처리하기 위해 여러 함수를 호출하다보면 반환된 결과의 타입이 무엇인지 분명하지 않을떄가 있다. 다음 함수들을 사용하여 데이터 타입을 손쉽게 판단할 수 있다. class(x) : 객체 x의 클래스 str(x) : 객체x의 내부구조 is.factor(x) : 주어진 객체 x가 팩터인가 is.numeric(x) : 주어진 객체 x가 숫자를 저장한 벡터인가 is.character(x) : 주어진 객체 x가 문자열을 저장한 벡터인가 is.matrix(x) : 주어진 객체 x가 행렬인가 is.array(x) : 주어진 객체 x가 배열인가 is.data.frame(x) : 주어진 객체 x가 데이터 프레임인가

(R) 성능 향상: 속도와 메모리

1. 속도향상을 위한 벡터화 ifelse(), which(), where(), any(),all(), cumsum(), cumprod()가 있다. 행렬의 경우 rowSums(), colSums() 등이있다. 2. 함수평 프로그래밍과 메모리 문제 대부분 R 객체는 '불변성'을 갖고 있어서 변경할 수 없다. 그래서 R연산은 특정 객체를 재할당하는 함수로 구현돼 있는데, 이런 성격은 성능에 영향을 미친다. *벡터할당 문제 z[3]<-8 이것은 내부에서 z를 복사하고 복사본의 3번쨰 원소를 8로바꿔, 결과 벡터를 z에 재할당한다. 그리고 이때 결과의 z는 복사본을 가리키고 있다는 것을 기억하자. 즉 벡터원소 하나를 바꿧을 뿐이지만, 문법적으로는 '벡터 전체를 새로 계산한 것이다' tracemem()은 메모리 재배치에 대해 알려준다.(주소를 알려줌) *리스트를 여러개 만드는 것보다 행렬 하나를 만드는게 빠르다.. *코드에서 느린 부분을 찾을 때 사용하는 Rprof() ********R세션의 모든 객체는 메모리에 저장된다. 램사이즈의 크기에 관계없이 231-1바이트의 객체 크기 제한이 있다. 하지만 좀만 신경을 쓰면 많은 메모리를 필요로하는 프로그램도 R에서 잘 사용할 수 있따. 청킹과 메모리 관리용 R패키지이다. 청킹 파일로부터 한번에 하나의 청크 단위로 부터 데이터를 읽어 들이는 방법이다. 예를들어 특정 변수의 평균이나 크기를 알고자 한다고하면, 이때 read.table()에서 skip인수를 사용할 수 있다.  데이터세트에 1,000,000개의 데이터가 있고 이를 10개 혹은 그 이상으로 메모리에 적합한 크기로 데이터를 잘랐다고 하자. 그리고 처음에는 skip=0으로 설정하고 두 번째는 skip=100000라고 설정해보자. 매번 청크를 읽을 때마다 각 청크의 수나 총합을 계산해 기록한다. 전체 평균이나 크기를 계산할 필요없이 모든 청크를 다 읽은...

(R) 시각화 함수 ggplot

이미지
*ggplot()함수는 data, 좌표시스템, geoms집합(데이터 점에 대한 시각적표현)을 사용한다. *ggplot 막대 그래프 library(ggplot2) ggplot(simpledat_long, aes(x=Aval, y=value, fill=Bval))+geom_bar(stat="identity", position="dodge") X축은 Aval, Y축은 value, 그리고 그 사이에 채워지는 값은 Bval이 된다. 만약 이 그래프를 선으로 바꾸려면 geom_line()을 사용하면 된다. *ggplot 선 그래프 ggplot(simpledat_long,aes(x=Aval,y=value,colour=Bval,group=Bval))+geom_line() fill 대신 colour을 사용해 '채우기' 색깔이 아닌 '선' 색깔에 대입하였다. *몇 가지 용어와 이론 데이터는 우리가 시각화하고 싶은 대상이다. 데이터는 '변수'로 구성되어 있으며, 변수는 데이터프레임에서 열로 저장한다. '도형(geom)'은 데이터를 표현하기 위해 그리는 도형 객체들로, 막대와 선, 점 등이있다. 에스테틱 속성(aesthetics)은 도형의 시각적인 속성으로, x위치나 y위치, 선 색상, 점 모양 등이다. 데이터 값을 에스테틱에 '대입(map)'한다. '척도(scale)'는 데이터의 공간의 값들을 에스테틱 공간의 값들로 대입하는 과정을 제어한다. 연속적인 y척도는 숫자가 큰 값을 수직 공간 상 더 높은 위치에 대입해준다. '가이드(guide)'는 독자가 시각적인 속성들을 데이터 공간으로 어떻게 대입해야 하는지 알려주는 역할을 한다. 가장 흔하게 사용하는 가이드로는 눈금표시와 축 라벨이있다. 예) dat<-d...

(R) plyr패키지 (ddply, adply)

이미지
1. adply 함수 adply()는 배열(a)을 받아 데이터 프레임(d)을 반환하는 함수다. 그러나 입력이 받으시 배열일 필요는 없다. 그보다는 주어진 입력을 숫자 색인으로 읽을 수 있는가(즉, 행렬처럼 다룰 수 있는 형태의 데이터인가)하는 점이 중요하다.  plyr::adply(      .data, #행렬,배열 또는 데이터프레임      #함수를 적용할 방향. 1(행 방향), 2(컬럼 방향) 또는 c(1,2)(행과 컬럼 모두의 방향)     .margins,     .fun=NULL  #.margin방향으로 잘려진 데이터에 적용할 함수 ) 반환값은 데이터 프레임이다. adply()함수는 apply()함수와 유사하지만, apply()는 행 방향으로 처리할 때 각 컬럼에 서로 다른 데이터 타입이 섞여 있다면 예상치 못한 타입 변환이 발생할 수 있다. apply()에 숫자형 컬럼만 입력으로 주어졌을 경우는 그 값이 제대로 숫자로 나오지만, 문자열이 섞이면 데이터가 모두 문자열로 변환된다. 반면 adply()를 사용해 결과를 데이터 프레임을 변환하면 결과 타입이 문자열로 모두 바뀌는 현상을 피할 수 있다. 예) >adply(iris,1,function(row){row$Sepal.Length>=5.0 & row$Species=="setosa"}) 2. ddply 함수 데이터 프레임을 분할하고 함수를 적용한 뒤 결과를 데이터 프레임으로 반환한다. plyr::ddply(      .data,      .variables, #데이터를 그룹 지을 변수명      .fun=NULL ) adply()와 ddply()의 가장 큰 차이점이라면 adply()는 행 또는 ...

(R) 크로스 집계

이미지
2개 변수의 인과관계를 교차해서 집계하는 분석기법을 크로스 집계라고 한다. 유저속성이 30대여성인 경우와 20대 남성인 경우에 행동패턴이 어떻게 바뀌는지 알고자 할 경우, 그 두가지 속성(성별과 연령대)의 행동결과에 대한 관계가 집계되기 때문에 이를 2중 크로스 집계라고 한다. 두 가지 이상의 유저속성을 이용해서 복합적인 항목과 결과의 인과관계를 도출하는 것을 다중(n중) 크로스 집계라고 한다. -->dau.user.info테이블에서 log_month와 gender 항목에 대해 크로스 집계를 실시한 결과이다. 2013년 8월과 9월에 전체적인 수치는 떨어졌지만, 남녀 간의 구성비율은 거의 변화가 없으므로 성별과 게임이용율 하락에는 연관관계가 크지 않다. 모든 연령대에서 대체로 비슷한 비율로 이용자수가 하락하였으므로, 특별히 특정 연령대가 하락에 영향을 끼쳤다고 볼 수 없다. *n중 크로스 집계 n중 크로스집계를 위해 reshape2라이브러리를 이용한다. 여기서 그중에서는 dcast라는 함수를 이용한다. dcast(AAA,XX~YY+ZZ,value.var="CCC",length) 위와 같이 입력하면 AAA라는 데이터에서 세로축에는 XX를 놓고 가로축에는 YY와 ZZ의 모든 가능한 조합을 놓아 크로스집계를 실시한다. '크로스 집계안의 값은 CCC의 숫자를 세어서 넣으라'는 것이 value.var="CCC", length에 해당한다. *시계열의 트렌드 그래프 그리기

(R) 11장. 문자열 처리

이미지
1. grep() grep(pattern,x)는 문자열 벡터 x에서 특정 부분 문자열 pattern을 찾기 위해 호출한다. 첫 번째의 경우"Pole" 문자열은 두 번쨰 인수의 2번째와 3번쨰 원소에서 나타난다. 두 번쨰의 경우 아무데도 없어서 빈 벡터가 반환된다. 2. nchar() nchar(x)는 x의 길이를 알려준다. >nchar("South Pole") [1] 10 3. paste() 여러 문자열을 하나의 긴 문자열로 합쳐준다. >paste("North","Pole") [1] "North Pole" >paste("North","Pole",sep=".") [1] North.Pole 예제에서 선택 인수 sep는 문자열 사이에 기본으로 사용되는 띄어쓰기 대신 다른 문자를 넣고 싶을 때 사용한다. 4. sprint() 주어진 형식에 맞춰서 문자열을 조합한다. >i<-8 >s<-sprintf("the square of %d is %d,i,i^2) [1] "the square of 8 is 64" 5. substr() substr(x, start, stop)은 주어진 문자열 x에서 start부터 stop까지의 범위에 위치한 부분 문자열을 출력한다. >substring("Equator",3,5) [1] uat 6. strsplit() strsplit(x, split)은 x에서 문자열 split을 기준으로 나눠 부분 문자열의 리스트를 만든다. >strsplit("6-16-2011",split="-") [[1]] [1...

(R) 7장 조건문

이미지
7.1 조건문 for문, while문, 7.1.2 벡터 이외의 유형을 사용하는 반복문 lapply() 를 사용한다. 반복문의 반복이 각각 순서가 상관없는 독립적인 데이터에 적용될 때 사용할 수 있다. get()을 사용한다. 함수명이 말해주듯이 함수는 객체의 이름을 뜻하는 문자열을 인수로 받아 해당 이름의 객체를 반환해 준다. 별것 아닌 것처럼 들리지만 get()은 매우 강력한 함수다. 여기서 m에는 첫 번째로 u가 들어간다. 그 후 u를 z에 할당해 다음에서 u에 대해 lm()이 호출되도록 한다. 7.2 산술 및 불리언 연산과 값 x^y : 제곱 x%/%y : 정수 나눗셈 x&&y : 불리언 AND(정수형) x&y : 불리언 AND(벡터 x,y,result) x/y : 나눗셈 x||y : 불리언 OR(정수형) x|y : 불리언 OR(벡터 x,y,result) * R은 함수 안에 다른 함수를 감싸 안을 수 있다. function(y){   d<-8   h<-function(){      return(d*(w+y))   }   print(environment(h))   return(h()) } *R에서 함수는 지역변수가 아닌 변수를 바꾸지 않는다는 것이다. 이 말은 일반적으로  '부작용 side effect'이 없다는 뜻이다. 간단히 말해 만약 지역변수내에서 값을 바꾸게 되면 값이바뀌는 것처럼 보이지만 지역 복사본이 바뀌는 것 뿐이다.

(R) 6장 팩터와 레벨

이미지
R팩터는 간단하게 벡터에 추가 정보가 더해진 것으로 보면된다. 추가정보는 벡터의 값 가운데 겹치지 않는 값의 기록으로 이뤄져 있고, 이를 '레벨level'이라고 한다. 예) x<-c(5,12,13,12) xf<-factor(x) xf는 [1] 5 12 13 12 Levels: 5 12 13 *팩터의 길이는 레벨의 수가 아닌 데이터의 길이로 정의된다. *다음처럼 세 레벨을 추가할 수 있다. x<-c(5,12,13,12) xff<-factor(x,levels=c(5,12,13,88)) xff는 [1] 5 12 13 12 Levels: 5 12 13 88 >xff[2]<-88 >xff [1] 5 88 13 12 Levels: 5 12 13 88 만약 레벨에 없는 겂 xff[2]<-28을 하게되면 에러가 발생한다. 6.2 팩터에 사용되는 일반적인 함수 6.2.1 tapply()함수 tapply()는 임시로 x를 팩터의 각 레벨(혹은 팩터가 여러 개일 경우 팩터의 레벨 간의 조합)에 대응되는 그룹별로 나눈 후 이에 따른 x의 부분 벡터에 g()를 적용한다. >ages<-c(25,26,55,37,21,42) >affils<-c("R","D","D","R","U","D") >tapply(ages,affils,mean) D    R    U 41  31   21 만약 팩터가 2개이상이면 어떻게 될까? 그럼 각 팩터는 앞의 예제처럼 각 그룹을 만들고, 각 그룹 간에 AND연산이 일어난다. 예를들어 성별, 나이, 수입에 대한 변수를 포함하는 데이터 세트에 tapply(x,f,g)에서 x는 수입, f는 성별과 해당 사람이 25살을 기준으로 아래인지 위인지가 표기된 두 개의 팩터가 될 것이다...

(R)

1. break 변수를 이용해 히스토그램의 도수 숫자를 바꿀 수 있다. hist(z,breaks=12)는 데이터 세트 z에 대해 12개의 도수로 이뤄진 히스토그램을 그릴 것이다. 2. 행렬의 곱셉은 %*%을 사용한다.