[R] if 문을 사용하여 함수를 적용하는 데이터 프레임의 행을 반복합니다.


Answers

이 작업에는 루프, 적용 문 또는 if 문이 필요하지 않습니다. 벡터화 된 작업 및 하위 집합 만 있으면됩니다.

t.d <- within(t.d, V4 <- V1 + V3)
t.d[!(t.d$V1>1 & t.d$V3<9), "V4"] <- 0
t.d

  V1 V2 V3 V4
1  1  4  7  0
2  2  5  8 10
3  3  6  9  0

왜이게 효과가 있니?

첫 번째 단계에서는 열 V1과 V4의 직선 합계 인 새 열을 만듭니다. 나는 항상 df$V 를 쓰지 않고 df 의 열을 참조하는 편리한 방법으로 사용합니다.

두 번째 단계에서는 조건을 충족시키지 못하는 행을 모두 서브 세트하고 V4를 0으로 설정합니다.

Question

저는 R에 익숙하지 않습니다. 합계가되는 요소가 모두 주어진 조건을 충족 시키면 주어진 데이터 프레임의 2 열을 합산하려고합니다. 일을 분명히하기 위해 내가하고 싶은 일은 :

> t.d<-as.data.frame(matrix(1:9,ncol=3))
> t.d
  V1 V2 V3
  1  4  7  
  2  5  8  
  3  6  9  

> t.d$V4<-rep(0,nrow(t.d))

> for (i in 1:nrow(t.d)){
+   if (t.d$V1[i]>1 && t.d$V3[i]<9){
+     t.d$V4[i]<-t.d$V1[i]+t.d$V3[i]}
+     }

> t.d    
  V1 V2 V3 V4
  1  4  7  0
  2  5  8 10
  3  6  9  0

내 실제 데이터 프레임에는 약 150000 개의 행과 200 개의 열이 있으므로 효율적인 코드가 필요합니다. 다음과 같은 오류가 발생합니다.

t.d$V4<-t.d$V1[t.d$V1>1]+ t.d$V3[t.d$V3>9] 

"적용"옵션이 있습니까? 나는 이것을 시도했다 :

t.d<-as.data.frame(matrix(1:9,ncol=3))
t.d$V4<-rep(0,nrow(t.d))

my.fun<-function(x,y){
  if(x>1 && y<9){
    x+y}
}

t.d$V4<-apply(X=t.d,MAR=1,FUN=my.fun,x=t.d$V1,y=t.d$V3)

하지만 오류도 발생합니다. 도와 주셔서 대단히 감사합니다.




ifelse 는 여기에 친구입니다.

t.d$V4<-ifelse((t.d$V1>1)&(t.d$V3<9), t.d$V1+ t.d$V3, 0)



나는 칩을 꽂고 또 다른 버전을 제공 할 것이다. 조건이 mach가 아닌 경우 0을 원하고, TRUE / FALSE가 1/0의 버전을 찬찬히 나타내므로 조건을 곱하면됩니다.

t.d<-as.data.frame(matrix(1:9,ncol=3))
t.d <- within(t.d, V4 <- (V1+V3)*(V1>1 & V3<9))

... 다른 솔루션보다 빠릅니다. ;-)

t.d <- data.frame(V1=runif(2e7, 1, 2), V2=1:2e7, V3=runif(2e7, 5, 10))
system.time( within(t.d, V4 <- (V1+V3)*(V1>1 & V3<9)) )         # 3.06 seconds
system.time( ifelse((t.d$V1>1)&(t.d$V3<9), t.d$V1+ t.d$V3, 0) ) # 5.08 seconds
system.time( { t.d <- within(t.d, V4 <- V1 + V3); 
               t.d[!(t.d$V1>1 & t.d$V3<9), "V4"] <- 0 } )       # 4.50 seconds