[英]R apply function to multiple columns
我有一個data.frame,其中有幾列具有1個數字(X0 1-5)或2個數字(X0 6)
> 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等,則會收到錯誤消息“強制轉換引入的NA”。
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
我有很多不同的方式-如果我一個接一個地工作,它將起作用,但是不能使其作為功能的一部分工作。
弄清楚了-感謝費迪南德:
> 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
使用此代替:
yvar = score[,paste0("Y",i)]
xvar = score[,paste0("X",i)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.