2016-12-06 1 views
-1

의 루틴 ( 아래 참조), 내 데이터를 탐색 할 수 여러"길이"+ "하는"문을 (아래 참조) 사용하고 자동화.내 데이터 감안할 때 R

1x. 효율적인 코드가 있습니까 자동화 이러한 많은 코드 줄을 사용하는 대신?

질문 2. 대답 "길이"+ "어느"인 테이블에서의 답을 요약 할 수 있습니까? (즉, 첫번째"길이"에 대한 + 예를 들어 "있는"테이블이 "1 사분면" 옆에 또는 9 아래를 말할 수있는 대답은 9입니다, 문)? 여기

내 데이터"길이를"+ "하는"내가 만든 문 :

x <- c(2,1,5,4,5,8,6,6,4,1,2,2,2,5,9,5,4,3,2,3,1,3,1,7,3,2,2,9,7,7,9,8,8,6,4,6,7,2,1,4,3,9) 
y <- c(1,2,2,8,7,4,6,7,5,5,2,9,3,9,1,5,7,1,8,6,8,4,9,2,7,5,7,6,3,8,3,3,7,8,3,4,4,4,3,6,5,4) 

## HERE is my "length" + "which" statements: 

length(x[which(x < 5 & y <5)]) ## 1st quadrant datapoints (Left Bottom) 
length(x[which(x < 5 & y >5)]) ## 2rd quadrant " 
length(x[which(x > 5 & y >5)]) ## 3rd quadrant " 
length(x[which(x > 5 & y <5)]) ## 4rd quadrant datapoints (Right Bottom) 

length(x[which(x < 5)]) ## 1st left half 
length(x[which(x > 5)]) ## 2nd right half 
length(x[which(y < 5)]) ## 1st Bottom half 
length(x[which(y > 5)]) ## 2nd Top half 

length(x[which(x==5)]) ## Balanced Scope 
length(x[which(y==5)]) ## Balanced Technicality 
length(x[which(x==5 & y==5)]) ## Equal Scope and Technicality 

length(x[which(y==5)]) ## How many of Xs have a Y of 5 
length(y[which(x==5)]) ## How many of Ys have a X of 5 
+3

체크 아웃 할 ... –

+0

당신은 여기에'()'문 중 하나를 필요가 없습니다. As [Hick Wickham :] (http://adv-r.had.co.nz/Subsetting.html) "처음 서브 세트를 배울 때 일반적인 실수는 대신에 x [which (y)]를 사용하는 것이다. 'x [y]'의 " – RHertel

+0

@RHertel은 NA 값을 어떻게 처리 할 것인가에 달려 있습니다. 'x [y]'와'y'가 NA 값을 포함한다면, 그 위치에 NA 값을 삽입하게됩니다. 이를 피하려면 isTRUE 또는 which를 사용하십시오. 나는 또한 하위 집합을 저장하고 동일한 하위 집합을 정의하는 전체 길이의 논리 벡터와 비교할 때 꽤 많은 메모리를 저장하기 위해'which '를 사용합니다. –

답변

1

당신이 당신 자신의 설명과 함께 멋진 테이블을 만들려면이 다음 가장 좋은 방법은 간단히 "많은"줄을 사용하는 것입니다.

names=c("1st quadrant", "2rd quadrant", "3rd quadrant", "...") 
numbers=c(length(x[x < 5 & y <5]), length(x[x < 5 & y >5]), length(x[x > 5 & y >5]), 12345) 

new_table=data.frame(names,numbers) 
1

첫째로 나는 length(x[which(logical_vector)])이 벡터의 길이가 x의 길이보다 더 이상 없습니다 단지 sum(logical_vector) 경우이므로주의하고 싶습니다 (귀하의 경우에 그들은 항상 같은 길이이다).

하지만 논리적 벡터를 요약하는 대신 다른 방법을 제안하려고합니다. x와 y는 평면에서 점의 좌표를 나타냅니다, 그래서 다음과 같은, 그들이 하나 dataframe에 바인드 한 자연 같습니다

d <- data.frame(x, y) 

정말 여기서 x와 y의에 대한 유일한 문제는 징후는 무엇인가 (x - 5)(y - 5) 표현식 (더 자세히 설명하겠습니다). 그들을 계산해 봅시다.

library(dplyr) 
d <- mutate(d, sx = sign(x - 5), sy = sign(y - 5)) 
head(d) 

    x y sx sy 
1 2 1 -1 -1 
2 1 2 -1 -1 
3 5 2 0 -1 
4 4 8 -1 1 
5 5 7 0 1 
6 8 4 1 -1 

그래서, 설명해주십시오. sx = -1sy = -1을 가지고 있다는 것은이 점 x < 5y < 5을 의미하므로 sxsy만을 알고있는 사분면을 결정할 수 있습니다.

이제 우리는 쿼드런트가 sxsy 인 것을 알려주는 사전을 만들어야합니다.마지막으로,

d <- merge(d, quadrant, all.x = T) 

그리고 그런 다음 우리는 단순히 quadrant 변수를 얻기 위해 그것으로 d을 병합 할 수 있습니다

library(tibble) 
quadrant <- tribble(
    ~sx, ~sy, ~quadrant, 
    -1, -1,   1, 
    -1, 1,   2, 
     1, 1,   3, 
     1, -1,   4 
) 

(몇 가지 포인트 나스있을 것이다, 그러나 그것은 문제가되지 않습니다) : 그것은 매우 간단합니다 사분면으로 요약을 얻기 위해 우리가? table``? cut`과`

count(d, quadrant) 

# A tibble: 5 × 2 
    quadrant  n 
    <dbl> <int> 
1  1  9 
2  2 10 
3  3  6 
4  4  9 
5  NA  8