2013-08-20 3 views
1

나는 코드를 다시 작성하려고하는데, 충분히 단순한 걸림돌로 달려 가고 있지만 인터넷에 대해 꽤 많은 시간을 들여서 알아낼 수는 없습니다 그래서 당신이 줄 수있는 도움에 감사드립니다.lapply "NAs는 할당 된 과제에서 허용되지 않습니다"

NA가 들어있는 데이터가 있습니다. 이 데이터를 사용하여 다시 코드화하고 싶지만 계속 "NAs는 하위 할당에 허용되지 않습니다."라는 오류가 계속 발생합니다. 예제 데이터 세트를 만들려고하면서 나는 "의미있는 요소"가 없다는 경고를 추가로 실행하고 있습니다. 어떤 도움을 주시면 감사하겠습니다.

내 가짜 데이터에는 "var1"과 "var2"(문자와 때로는 누락 됨) 및 "var3"(숫자)의 세 가지 변수가 있습니다. beta가 0보다 큰 경우 "var1"의 값을 포함하고 베타가 0보다 작은 경우 "var2"의 값을 포함하는 네 번째 변수를 생성하려고합니다. VAR1 또는 VAR2이없는 경우에, 나는 새 변수는없는 것으로합니다 :

var1<-c("A","T",NA,"G","C") 
var2<-c("G","A",NA,"A","G") 
var3 <-c(-.1,3,-4,5,-3) 
df=as.data.frame(cbind(var1,var2,var3)) 

df$newVar[df$var3>0]=df$var1[df$var3>0] 
df$newVar[df$var3<0]=df$var2[df$var3<0] 

는 내가 얻을하는 빨간색의 무리입니다 :

df$newVar[df$var3>0]=df$var1[df$var3>0] 
Error in df$newVar[df$var3 > 0] = df$var1[df$var3 > 0] : 
NAs are not allowed in subscripted assignments 
In addition: Warning messages: 
1: In Ops.factor(df$var3, 0) : > not meaningful for factors 
2: In Ops.factor(df$var3, 0) : > not meaningful for factors 
df$newVar[df$var3<0]=df$var2[df$var3<0] 
Error in df$newVar[df$var3 < 0] = df$var2[df$var3 < 0] : 
NAs are not allowed in subscripted assignments 
In addition: Warning messages: 
1: In Ops.factor(df$var3, 0) : < not meaningful for factors 
2: In Ops.factor(df$var3, 0) : < not meaningful for factors 

어떤 조언을 주시면 감사하겠습니다. 고맙습니다.

+0

무엇을 다시 코딩 하시겠습니까? 원하는 결과가 여기에 도움이 될 것입니다. –

+0

'ifelse' 문을 사용해 보셨습니까? –

+0

[R의 여러 데이터 프레임을 통해 레코딩]의 복제본이 가능합니다. (http://stackoverflow.com/questions/18323236/recoding-over-multiple-data-frames-in-r) – Metrics

답변

4

귀하의 문제는 당신이 그 (것)들을 당신이 당신의 data.frame을 할 때 고려하도록 강요하는 원인이 cbinddata.frame하기 전에,이 같은 클래스로하여 세 개의 변수를 (문자되어야하는) 강제 변환 사용하고 있다는 점이다.

대신, 단지

df <- data.frame(var1, var2, var3) 

newVar에 대해 동일한 코드를 실행 할 당신은 얻을해야합니다

var1 var2 var3 newVar 
1 A G -0.1  2 
2 T A 3.0  4 
3 <NA> <NA> -4.0  NA 
4 G A 5.0  3 
5 C G -3.0  2 
+0

+1. 그냥 같은 대답을 게시 ... – A5C1D2H2I1M1N2O1R2T1

+0

+1 나는 당신이 게시 할 때 이것을 쓰고 있었다. 하지만 나는 더 간단하고 효율적인 방법을 옹호 할 것이다. –

1

당신은 크게 당신이 당신의 변수를 코딩하는 방법을 단순화 할 수 있습니다. 이미 다른 곳에서 지적한 바와 같이 cbind을 사용하지 말고 ... 데이터 프레임을 부분 집합화하기 위해 아래 첨자 변수의 2 열 행렬을 제공 할 수 있습니다. 그래서 우리는 다음과 같이 할 수 있습니다 :

df <- data.frame(var1 , var2 , var3) 

# Gives 1 if 'var3' is greater than 0 and 2 otherwise (the numbers of the columns you want!) 
ind <- (! df$var3 > 0) + 1 
#[1] 2 1 2 1 2 

# Get each row selecting either column 1 or two 
df$newVar <- df[ cbind(1:nrow(df) , ind) ] 
# var1 var2 var3 newVar 
#1 A G -0.1  G 
#2 T A 3.0  T 
#3 <NA> <NA> -4.0 <NA> 
#4 G A 5.0  G 
#5 C G -3.0  G 
관련 문제