알아야 할 R data.table 기호 및 연산자

R data.table 코드는 특수 기호와 기능을 활용하면 더욱 효율적이고 우아해집니다. 이를 염두에두고 새 열을 하위 집합, 계산 및 생성하는 몇 가지 특별한 방법을 살펴 보겠습니다.

이 데모에서는 2019 Stack Overflow 개발자 설문 조사의 데이터를 사용하여 약 90,000 개의 응답을 제공 할 것입니다. 따라하려면 Stack Overflow에서 데이터를 다운로드 할 수 있습니다.

data.table 패키지가 시스템에 설치되지 않은 경우 CRAN에서 설치 한 다음 library(data.table). 시작하려면 데이터 구조를 더 쉽게 조사 할 수 있도록 데이터 세트의 처음 몇 행만 읽어야 할 수 있습니다. data.table의 fread()함수와 nrows인수 로이를 수행 할 수 있습니다 . 10 행으로 읽겠습니다.

data_sample <-fread ( "data / survey_results_public.csv", nrows = 10)

보시다시피 85 개의 열이 있습니다. (모든 열의 의미를 알고 싶다면 데이터 스키마와 원본 설문 조사의 PDF가 포함 된 파일이 다운로드에 있습니다.) 

모든 데이터를 읽기 위해 다음을 사용합니다.

mydt <-fread ( "data / survey_results_public.csv")

다음으로, 더 쉽게 작업하고 결과를 볼 수 있도록 몇 개의 열만있는 새 data.table을 만듭니다. data.table이 다음 기본 구문을 사용한다는 점을 상기시킵니다. 

mydt [i, j, by]

data.table 패키지 소개에서는이를 "i를 사용하여 dt, 하위 집합 또는 행 재정렬, j 계산, 그룹화"라고 읽습니다. i와 j는 base R의 대괄호 순서와 유사합니다. 행은 먼저, 열은 두 번째입니다. 따라서 나는 행에서 수행 할 작업 (행 번호 또는 조건에 따라 행 선택)을위한 것입니다. j는 열로 수행 할 작업입니다 (열을 선택하거나 계산에서 새 열을 생성). 그러나 기본 R 데이터 프레임보다 data.table 대괄호 내부에서 더 많은 작업을 수행 할 수 있습니다. 그리고 "by"섹션은 data.table의 새로운 기능입니다.

열을 선택 했기 때문에 해당 코드는 "j"자리에 들어가게됩니다. 즉, "i"자리를 비워 두려면 먼저 쉼표가 필요합니다.

mydt [, j]

data.table 열 선택

data.table에 대해 내가 좋아하는 것 중 하나는 quoted 또는 unquoted 열을 선택하기 쉽다는 것입니다 . Unquoted 는 종종 더 편리합니다 (일반적으로 깔끔한 방법입니다). 그러나 quoted 는 자체 함수 내에서 data.table을 사용하거나 코드의 다른 곳에서 만든 벡터를 전달하려는 경우 유용합니다.

따옴표로 묶인 열 이름의 일반적인 벡터를 사용하여 일반적인 기본 R 방식으로 data.table 열을 선택할 수 있습니다. 예를 들면 : 

dt1 <-mydt [, c ( "LanguageWorkedWith", "LanguageDesireNextYear",

"OpenSourcer", "CurrencySymbol", "ConvertedComp",

"애호가")]

당신이 그들을 사용하려는 경우 취소 인용을하는 생성 목록을 대신 벡터 당신은 인용 부호로 둘러싸이지 않은 이름에 전달할 수 있습니다. 

dt1 <-mydt [, list (LanguageWorkedWith, LanguageDesireNextYear,

OpenSourcer, CurrencySymbol, ConvertedComp,

애호가)]

이제 우리는 첫 번째 특별한 상징에 도달했습니다. 을 입력하는 대신 list()점만 사용할 수 있습니다.

dt1 <-mydt [,. (LanguageWorkedWith, LanguageDesireNextYear,

OpenSourcer, CurrencySymbol, ConvertedComp,

애호가)]

이것은 내부 data.table 대괄호에 .()대한 바로 가기입니다 list().

이미 존재하는 열 이름 벡터를 사용하려면 어떻게해야합니까? data.table 대괄호 안에 벡터 객체 이름을 넣는 것은 작동하지 않습니다. 다음과 같이 인용 된 열 이름으로 벡터를 생성하면 : 

mycols <-c ( "LanguageWorkedWith", "LanguageDesireNextYear",

"OpenSourcer", "CurrencySymbol", "ConvertedComp", "Hobbyist")

그러면이 코드가  작동 하지 않습니다

dt1 <-mydt [, mycols]

대신 .. 벡터 객체 이름 앞에 (두 개의 점) 을 넣어야 합니다.

dt1 <-mydt [, ..mycols]

왜 두 개의 점? 설명을 읽을 때까지 그것은 나에게 일종의 무작위로 보였습니다. 한 디렉토리 위로 이동하는 Unix 명령 행 터미널의 두 점으로 생각하십시오. 여기서는 data.table 대괄호 내부 환경에서 전역 환경으로 하나의 namespace 위로 이동 합니다. (정말 기억하는 데 도움이됩니다!)

data.table 행 계산

다음 기호로 이동합니다. 그룹별로 계산하려면 "행 수"를 나타내는 data.table의 .N기호를  사용할 수 있습니다 .N. 총 행 수이거나 "기준"섹션에서 집계하는 경우 그룹당 행 수일 수 있습니다. 

이 표현식은 data.table의 총 행 수를 반환합니다. 

mydt [, .N]

다음 예제는 하나의 변수로 그룹화 된 행 수를 계산합니다. 설문 조사에 참여한 사람들이 취미로 코딩하는지 ( Hobbyist변수).

mydt [, .N, 애호가]

# 반환 :

Hobbyist N 1 : 예 71257 2 : 아니요 17626

변수가 하나만있는 경우 data.table 대괄호 안에 일반 열 이름을 사용할 수 있습니다. 둘 이상의 변수로 그룹화하려면 .기호를 사용하십시오 . 예를 들면 :

mydt [, .N,. (애호가, OpenSourcer)]

결과를 가장 높은 순서에서 가장 낮은 순서로 정렬하려면 첫 번째 뒤에 두 번째 대괄호 세트를 추가 할 수 있습니다. .N행의 수에 의해 순서는 다음과 같이 보일 수 있도록 기호는 자동으로 N (당신이 원한다면 물론 당신이 그것을 이름을 바꿀 수 있습니다)라는 이름의 열을 생성합니다 :

mydt [, .N,. (Hobbyist, OpenSourcer)] [order (Hobbyist, -N)]

data.table 코드를 배우면서 단계별로 읽는 것이 도움이됩니다. 그래서 나는 이것을 " mydt의 모든 행에 대해 ("I "지점에 아무것도 없기 때문에), 행 수를 세고, Hobbyist와 OpenSourcer별로 그룹화합니다. 그런 다음 Hobbyist에서 먼저 주문한 다음 내림차순으로 행 수를 지정합니다. " 

이는 다음 dplyr 코드와 동일합니다.

mydf %> %

카운트 (애호가, OpenSourcer) %> %

주문 (애호가, -n)

tidyverse 기존의 여러 줄 접근 방식이 더 읽기 쉽다면이 data.table 코드도 작동합니다.

mydt [, .N,

. (애호가, OpenSourcer)] [

주문 (애호가, -N)

]

data.table에 열 추가

다음으로 각 응답자가 R을 사용하는지, Python을 사용하는지, 둘 다 사용하는지 또는 둘 다 사용하지 않는지 확인하기 위해 열을 추가하고 싶습니다. LanguageWorkedWith열은 사용 언어에 대한 정보를 가지고 있으며, 데이터의 몇 행은 다음과 같이 :

샤론 마클리스

각 답변은 단일 문자열입니다. 대부분은 세미콜론으로 구분 된 여러 언어를 가지고 있습니다.

종종 그렇듯이, "Python"을 검색 할 수있는 방식으로 문자열에서 "R"을 검색 할 수 없기 때문에 (Ruby와 Rust도 대문자 R을 포함) R보다 Python을 검색하는 것이 더 쉽습니다. 다음은 각 문자열에 LanguageWorkedWithPython 이 포함되어 있는지 확인하는 TRUE / FALSE 벡터를 만드는 더 간단한 코드입니다 .

ifelse (LanguageWorkedWith % like % "Python", TRUE, FALSE)

SQL을 알고 있다면 "like"구문을 인식 할 것입니다. 나는 %like%. 패턴 매칭을 확인하는 능률적 인 방법이라고 생각합니다. 함수 문서에는 data.table 대괄호 내에서 사용하도록되어 있지만 실제로는 data.tables뿐만 아니라 모든 코드에서 사용할 수 있습니다. data.table의 제작자 인 Matt Dowle과 확인했는데, 괄호 안에 사용하라는 조언은 거기에서 추가적인 성능 최적화가 발생하기 때문이라고 말했습니다.

다음은 data.table에 PythonUser라는 열을 추가하는 코드입니다.

dt1 [, PythonUser : = ifelse (LanguageWorkedWith % like % "Python", TRUE, FALSE)]

:=운영자를 주목하십시오 . 파이썬에도 이와 같은 연산자가 있습니다. "바다 코끼리 연산자"라는 말을 들었을 때부터 그것을 제가 부릅니다. 공식적으로는 "참조에 의한 할당"이라고 생각합니다. 그 이유는 위의 코드 가 새 변수에 저장할 필요 없이 새 열을 추가하여 기존 객체 dt1 data.table을 변경했기 때문 입니다.

R을 검색하려면, 나는 정규 표현식 사용합니다 "\\bR\\b"말한다 : -은 "단어 경계로 시작하는 패턴 찾기 \\b, 다음 R, 다음 또 다른 단어 경계로 끝을. (각 문자열의 마지막 항목에는 세미콜론이 없기 때문에 "R;"만 찾을 수 없습니다.) 

그러면 dt1에 RUser 열이 추가됩니다.

dt1 [, RUser : = ifelse (LanguageWorkedWith % like % "\\ bR \\ b", TRUE, FALSE)]

한 번에 두 열을 모두 추가 :=하려면 다음과 같이 해마 연산자를 역 따옴표로 묶어 함수로 바꿔야합니다.

dt1 [, `: =` (

PythonUser = ifelse (LanguageWorkedWith % like % "Python", TRUE, FALSE),

RUser = ifelse (LanguageWorkedWith % like % "\\ bR \\ b", TRUE, FALSE)

)]

더 유용한 data.table 연산자

알아 두어야 할 몇 가지 다른 data.table 연산자가 있습니다. %between% 오퍼레이터는이 구문이

myvector % between % c (하한값, 상한값)

따라서 보상이 미국 달러로 50,000에서 100,000 사이 인 모든 응답을 필터링하려면 다음 코드가 작동합니다.

comp_50_100k <-dt1 [CurrencySymbol == "USD"&

ConvertedComp % between % c (50000, 100000)]

위의 두 번째 줄은 사이 조건입니다. 점을 유의 %between%오퍼레이터 상하부 값 그 수표를 모두 포함한다.

또 다른 유용한 연산자는 %chin%. 기본 R처럼 작동 %in%하지만 속도에 최적화되어 있으며 문자 벡터 전용 입니다. 따라서 OpenSourcer 열이 "Never"또는 "1 년에 한 번 미만"인 모든 행을 필터링하려면이 코드가 작동합니다.

rareos <-dt1 [OpenSourcer % chin % c ( "Never", "1 년에 한 번 미만")]

이것은 base R이 대괄호 안에 데이터 프레임 이름을 지정해야하고 필터 표현식 뒤에 쉼표가 필요하다는 점을 제외하면 base R과 매우 유사합니다.

rareos_df <-df1 [df1 $ OpenSourcer % in % c ( "Never", "1 년에 한 번 미만"),]

새로운 fcase () 함수

이 마지막 데모에서는 보상을 미국 달러로보고 한 사람 만있는 새 data.table을 만드는 것으로 시작하겠습니다.

usd <-dt1 [CurrencySymbol == "USD"&! is.na (ConvertedComp)]

다음으로, Language누군가가 R 만 사용하는지, Python 만 사용하는지, 둘 다 사용하는지 또는 둘 다 사용하지 않는지에 대한 새 열을 만듭니다 . 새로운 fcase()기능을 사용하겠습니다 . 이 기사가 게시 될 당시에는 fcase()data.table의 개발 버전에서만 사용할 수있었습니다. data.table이 이미 설치되어있는 경우 다음 명령을 사용하여 최신 dev 버전으로 업데이트 할 수 있습니다. 

data.table :: update.dev.pkg ()

fcase () 함수는 SQL의 CASE WHEN명령문 및 dplyr의 case_when()함수 와 유사 합니다. 기본 구문은 다음  fcase(condition1, "value1", condition2, "value2")과 같습니다. "기타 모든 것"의 기본값은를 사용하여 추가 할 수 있습니다 default = value.

다음은 새 언어 열을 만드는 코드입니다.

usd [, 언어 : = fcase (

RUser &! PythonUser, "R",

PythonUser 및! RUser, "Python",

PythonUser 및 RUser, "둘 다",

! PythonUser &! RUser, "둘 다 아님"

)]

읽기 쉽기 때문에 각 조건을 별도의 줄에 넣었지만 반드시 그럴 필요는 없습니다.

주의 : RStudio를 사용하는 경우 해마 연산자로 새 열을 생성 한 후 오른쪽 상단 RStudio 창에서 data.table 구조가 자동으로 업데이트되지 않습니다. 열 수의 변경 사항을 보려면 새로 고침 아이콘을 수동으로 클릭해야합니다.

이 기사에서 다루지 않을 몇 가지 다른 기호가 있습니다. 를 실행하여 "특수 기호"data.table 도움말 파일에서 목록을 찾을 수 있습니다 help("special-symbols"). 가장 유용한 것 중 하나 인 .SD에는 이미 자체적 인 Do More With R 기사와 비디오 인 "R data.table 패키지에서 .SD를 사용하는 방법"이 있습니다.

더 많은 R 팁을 보려면 "R로 더 많은 작업 수행"페이지로 이동하거나 "R로 더 많은 작업 수행"YouTube 재생 목록을 확인하십시오.