2013-07-25 129 views
0

我有與任一數1若干列一個data.frame(X0 1-5),或2個數字(X0 6)r使用功能的多個列

> head(score) 
    X0 X1 X2 X3 X4 
1 8 <NA> <NA> <NA> <NA> 
2 3 <NA> <NA> <NA> <NA> 
3 <NA> 6 6 <NA> <NA> 
4 6 <NA> <NA> <NA> <NA> 
5 8 <NA> <NA> <NA> <NA> 
6 3 4 <NA> <NA> <NA> <NA> <--- Note X0 has 2 numbers (3, 4) as characters 

Split each XN column and create a YN column that is the sum of the split XN 
> score$Y0 <- sapply(strsplit(as.character(score$X0), split = " "), function(x) as.numeric(x[1]) + as.numeric(x[2])) 

Where XN had no split value (i.e. it was only 1 number), replace YN with XN 
> score$Y0 = with(df, ifelse(is.na(score$Y0), score$X0, score$Y0)) 

So the final variable YN (Y0) will be either X0, or the sum of X0 splits 
> head(score) 
X0 X1 X2 X3 X4 Y0 
1 8 <NA> <NA> <NA> <NA> 8 
2 3 <NA> <NA> <NA> <NA> 3 
3 <NA> 6 6 <NA> <NA> <NA> 
4 6 <NA> <NA> <NA> <NA> 6 
5 8 <NA> <NA> <NA> <NA> 8 
6 3 4 <NA> <NA> <NA> <NA> 7 <- sum of X0 numbers (3,4) 

我能夠手動執行此,但是如果我嘗試將這個函數包裝到運行Y0:X0,Y1:X1,Y2:X2等函數中,我會收到一條錯誤消息「由強制引入的NAs」。

for (i in 0:4) { 
yvar = paste("score$Y",i,sep="") 
xvar = paste("score$X",i,"sep="") 
yvar <- sapply(strsplit(xvar,split=" "), function(x) as.numeric(x[1]) + as.numeric(x[2])) 
yvar <- with(score, ifelse(is.na(yvar), xvar, yvar)) 
} 

Warning messages: 
1: In FUN(X[[1L]], ...) : NAs introduced by coercion 
2: In FUN(X[[1L]], ...) : NAs introduced by coercion 
3: In FUN(X[[1L]], ...) : NAs introduced by coercion 
4: In FUN(X[[1L]], ...) : NAs introduced by coercion 
5: In FUN(X[[1L]], ...) : NAs introduced by coercion 

我有許多不同的方式 - 如果我做逐一它會工作,但不能把它作爲一個功能的一部分工作。

+0

字符串不返回的對象。 –

回答

0

使用這個代替:

yvar = score[,paste0("Y",i)] 
xvar = score[,paste0("X",i)] 
1

想通了 - 由於費迪南德:對象名稱

> head(score) # Original Data 
X1 X2 X0 X3 X4 
1 5 1 6 1 <NA> <NA> <NA> 
2 1 2 4 <NA> <NA> <NA> 
3 <NA> <NA> 6 <NA> <NA> 
4 <NA> <NA> 4 <NA> <NA> 
5 <NA> <NA> 4 3 <NA> <NA> 
6 1 2 4 <NA> <NA> <NA> 

> nvars <- max(grep("^X\\d$", names(score)))-1 # Count the # of XN variables (-1) 
> nvars 
[1] 4 

# For each variable, split and sum the resulting numbers 
> for (i in 0:nvars) { 
+ score[,paste0("Y",i)] <- sapply(strsplit(as.character(score[,paste0("X",i)]), split =  " "), function(x) sum(as.numeric(x))) 
+ } 
# Final Data 
> head(score) 
    X1 X2 X0 X3 X4 Y0 Y1 Y2 Y3 Y4 
1 5 1 6 1 <NA> <NA> <NA> NA 6 7 NA NA 
2 1 2 4 <NA> <NA> <NA> NA 1 6 NA NA 
3 <NA> <NA> 6 <NA> <NA> 6 NA NA NA NA 
4 <NA> <NA> 4 <NA> <NA> 4 NA NA NA NA 
5 <NA> <NA> 4 3 <NA> <NA> 7 NA NA NA NA 
6 1 2 4 <NA> <NA> <NA> NA 1 6 NA NA